我正在开发一个使用大型MySQL表的spring应用程序.加载大表时,我得到OutOfMemoryException,因为驱动程序试图将整个表加载到应用程序内存中.

我试着用

statement.setFetchSize(Integer.MIN_VALUE);

但我打开的每个结果集都会挂起close();在网上查看时,我发现这是因为它在关闭结果集之前try 加载任何未读行,但事实并非如此,因为我这样做:

ResultSet existingRecords = getTableData(tablename);
try {
    while (existingRecords.next()) {
        // ...
    }
} finally {
    existingRecords.close(); // this line is hanging, and there was no exception in the try clause
}

挂起也发生在小表(3行)上,如果我不关闭记录集(在一个方法中发生),那么connection.close()次挂起.


挂起的堆栈跟踪:

SocketInputStream.socketRead0(文件描述符,字节[],int,int,int)行:不可用[本机方法]

推荐答案

Don't close your 100s twice.

显然,当关闭Statement时,它会try 关闭相应的ResultSet,从堆栈跟踪的这两行中可以看到:

DelegatingResultSet.关闭()行:152

我原以为挂在ResultSet.close(),但实际上是在Statement.close(),这叫ResultSet.close().由于ResultSet号已经关闭,它就挂了.

我们已经将所有ResultSet.close()个替换为results.getStatement().close()个,并删除了所有Statement.close()个,现在问题已经解决.

Mysql相关问答推荐

优化使用ORDER BY加载耗时较长的MySQL请求

为什么用PyMySQL构建的json返回结果会出现重复?

将 JSON 类型的列与特定字符串值进行比较

过滤值为0时如何在MySQL查询中设置条件?

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

按优先级 for each 具有 status_id 的员工 Select 单行

状态为已发货的订单返回产品总数量的SQL(不同的两张表)

如何编写按天数汇总值的sql查询?

最后一个字母 '%n' 的 mysql SELECT 字符串不起作用

提取 MySQL 5.7 连续值的差异

mysql 5.5;可以从记录中排除表吗?

如何使用 laravel 连接 mysql?

脚本超时,如果要完成导入,请重新提交相同的文件,导入将恢复

从 MYSQL 查询中计算列的平均值

MySQL Workbench 无法加载 mysql.proc

如何将时刻 JS 时间插入 MySQL

如何在 MySQL 中删除此索引?

如何将 mysqldump 的输出拆分为较小的文件?

从 MySQL JSON 数据类型中提取不带引号的值

在 PHP 中运行 MySQL *.sql 文件