Fel*_*mel 5 java mysql database-connection jdbc
我使用JDBC连接发出了一个查询:
Connection conn = null
Class.forName("com.mysql.jdbc.Driver")
conn = DriverManager.getConnection(dbHost, dbUser, dbPass)
s = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
s.setFetchSize(Integer.MIN_VALUE);
r = s.executeQuery (MY_SELECT_QUERY);
while(...) {
processResultSet(r);
}
Run Code Online (Sandbox Code Playgroud)
在while
很长一段时间处理ResultSet中运行。大约1小时后,我得到了例外:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败
从服务器成功接收到的最后一个数据包是74毫秒前。成功发送到服务器的最后一个数据包是4,351,980毫秒之前。
Run Code Online (Sandbox Code Playgroud)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:407) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3082) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2968) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3516) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:931) at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1429) at com.mysql.jdbc.RowDataDynamic.nextRecord(RowDataDynamic.java:416) at com.mysql.jdbc.RowDataDynamic.next(RowDataDynamic.java:395) at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7171) at com.busk.indexer.AbstractIndexerClient.indexResultSet(AbstractIndexerClient.scala:34) at com.busk.indexer.ContinousIndexer.startIndexingLoop(ContinousIndexer.scala:18) at com.busk.indexer.IndexerServer$.main(IndexerServer.scala:95) at com.busk.indexer.IndexerServer.main(IndexerServer.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)
我已经四处搜寻,但是几乎所有错误都与连接池有关,并且使用了8小时以上的连接(默认的wait_timeout mysql设置)。就我而言,我处于ResultSet处理的中间,并且出现此错误。
如果发生这种情况是因为结果集中有大量数据,我建议使用“LIMIT s, m”对响应进行分页(其中 s - 起始记录,m - 最大记录 - 均为整数)。然后在循环中一次处理 1000 条记录的部分数据:
boolean finished = false;
int start = 1;
int max = 1000;
do {
r = s.executeQuery (MY_SELECT_QUERY + " LIMIT " + start + ", " + max);
finished = // if r returned less than M records
while(...) {
processResultSet(r);
}
start += // number of returned records;
} while (!finished);
Run Code Online (Sandbox Code Playgroud)
当然,1000 是任意数字,您可以尝试一下并找到适合您查询的最佳最大大小。
更新:如果每条记录的处理需要很长时间,则将记录存储在列表中,并在从数据库中获取所有数据时迭代它们。
归档时间: |
|
查看次数: |
1720 次 |
最近记录: |