dso*_*len 10 java mysql sql jdbc
我正在使用MySQL,并希望利用该setFetchSize属性.默认的MySQL JDBC实现并不真正尊重它.如果设置FETCHSIZE到Integer.MIN_VALUE会分别读取每一行,但考虑到我想使用的原因FETCHSIZE是,我有足够的数据来把我的内存使用量成是要永远拿去做每行一个查询2 G范围.
我想插入一个可以与MySQL一起工作的JDBC实现并正确地考虑获取大小,允许我设置一个10,000或其他更高限制的fetchsize.任何人都可以指向一个可能提供这种实现的jar吗?失败那是否有任何其他资源允许我合理地以有效的方式执行包含数万个条目的查询,但是在内存和所需的sql查询数量方面.
lxg*_*xgr 16
如果启用MySQL JDBC选项 useCursorFetch,驱动程序确实会遵守fetchSize.
但是,这种方法有一个缺点:它将使用服务器端游标,在MySQL中使用临时表实现.这意味着在服务器上完成查询之后结果才会到达,并且将在服务器端使用额外的内存.
如果您只是想使用结果流而不关心确切的提取大小,那么开销setFetchSize(Integer.MIN_VALUE)并不像文档所暗示的那么糟糕.它实际上只是禁用整个响应的客户端缓存,并在它们到达时为您提供响应; 每行不需要往返.
从技术上讲,要求图书馆的问题是题外话。也就是说,据我所知,MySQL 没有替代驱动程序。您可以选择获取可能导致内存不足情况的所有行,或者让驱动程序通过设置setFetchSize(Integer.MIN_VALUE).
这样做的原因 - 正如我从Connector/J 实现说明中了解到的- 是 MySQL 协议每个连接不能打开一个以上的游标,因此它默认将所有行在执行时流式传输到客户端。
另一种选择是逐行检索行,但这会带来问题,即在处理 时无法在同一连接上执行其他语句ResultSet:
这种方法有一些注意事项。您必须先读取结果集中的所有行(或关闭它),然后才能对连接发出任何其他查询,否则将引发异常。
因此 MySQL 只能选择获取所有内容或一次获取一个。这意味着驱动程序无法遵守不同的提取大小。并且由于在一对一进行时的警告,他们选择使用Integer.MIN_VALUE(而不是简单地1)作为您在执行此操作之前应该真正考虑的信号。
一个可能的“在中间”解决方案将需要您自己使用编程这个LIMIT和OFFSET并多次执行查询。
| 归档时间: |
|
| 查看次数: |
7516 次 |
| 最近记录: |