这不是上述问题的答案。由于我不能评论它,所以我去提供它作为答案。对于一些面临类似问题的人来说,这可能会有帮助
对于批处理作业,由于结果集太大,我需要打开流模式。首先,如在MySQL doc看到,设置我的连接起来是这样的:
Statement extrapackStreamingQuery = dbExtrapackConnection.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
extrapackStreamingQuery.setFetchSize(Integer.MIN_VALUE);
但是,如果系统给我的错误:
Application was streaming results when the connection failed. Consider raising value of 'net_write_timeout' on the server.
我也尝试了几个配置选项,如:max_allowed_packet = 128M
,max_connect_errors = 9999
和net_write_timeout = 180
。但他们都没有帮助。
错误地认为TCP连接可能由于空闲时间太长而关闭,我甚至尝试在和/etc/sysctl.conf
文件中用net.ipv4.tcp_keepalive_time=60
更改TCP ping时间帧。事实上,如果打开数据库连接但没有足够长的TCP数据包发送时间,那么当TCP连接关闭时,数据库连接将会丢失。更频繁地发送TCP数据包以保持TCP连接处于活动状态可能会解决此问题。
但是这也没有帮助。
然后,阅读本piece后,我改变我的连接设置到:
protected static final int DB_STREAMING_FETCH_AMOUNT = 50;
...
Statement extrapackStreamingQuery = dbExtrapackConnection.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
extrapackStreamingQuery.setFetchSize(DB_STREAMING_FETCH_AMOUNT);
使用尾随选择我的网址:
String fullUrl = url + host + ":" + port + "/" + dbName;
if (streaming) {
fullUrl += "?useCursorFetch=true";
}
我的批处理作业现在工作正常,它完成,然后甚至跑得更快。
Integer.MIN_VALUE是负数,它如何获取一些负数行? – 2014-09-25 19:19:08
@ElliottFrisch这就是MySQL JDBC驱动程序的工作方式。它要么提取(流)所有的东西,要么在指定'Integer.MIN_VALUE'时允许1x1检索。请参见http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html(在ResultSet下) – 2014-09-26 06:36:41
_“必须每行执行一个查询”_我是否正确理解你认为fetchSize管理检索到的最大行数?因为这不会发生:单个查询仍会生成所有行,它只会逐行读取行。 – 2014-09-26 06:40:04