Mysql遍历大表(蓝阳:JDBC Mysql大量数据读取内存溢出的解决方法)
2014-03-21 01:47
337 查看
转自:/article/4095017.html
转载内容:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很大的表,则可能把内存撑爆。
一种办法是:用limit,offset,但这样你会发现取数据的越来越慢,原因是设置了offset,mysql需要将读取位置移动到offset的位置,随着offset增大,取数据也越来越慢;
另外一种办法是:用数据流的方式取数据,这时需要设置:
Java代码
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这时候,mysql jdbc driver,一行行的取结果集。
但这种方式有几个限制:
只能从该连接只能取完所有结果集后才能运行其他SQL;
resultset.getRow(),是不支持的,调用会抛unsupportedException;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我在使用该方法的时候出现过类似以下错误:
Caused
by: java.sql.SQLException: Streaming result set
com.mysql.jdbc.RowDataDynamic@5bdbda4f
is still active.No
statements may be issued when any streaming result sets are open and in use on a given connection.Ensure
that you have called .close() on any active streaming result sets before attempting more queries.
原因就是违反了第一个限制,所以如果查询的数据集没有读取完,其他的sql操作都要另起一个connection。
转载内容:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很大的表,则可能把内存撑爆。
一种办法是:用limit,offset,但这样你会发现取数据的越来越慢,原因是设置了offset,mysql需要将读取位置移动到offset的位置,随着offset增大,取数据也越来越慢;
另外一种办法是:用数据流的方式取数据,这时需要设置:
Java代码
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这时候,mysql jdbc driver,一行行的取结果集。
但这种方式有几个限制:
只能从该连接只能取完所有结果集后才能运行其他SQL;
resultset.getRow(),是不支持的,调用会抛unsupportedException;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我在使用该方法的时候出现过类似以下错误:
Caused
by: java.sql.SQLException: Streaming result set
com.mysql.jdbc.RowDataDynamic@5bdbda4f
is still active.No
statements may be issued when any streaming result sets are open and in use on a given connection.Ensure
that you have called .close() on any active streaming result sets before attempting more queries.
原因就是违反了第一个限制,所以如果查询的数据集没有读取完,其他的sql操作都要另起一个connection。
相关文章推荐
- mysql-5.5.29-win32压缩版配置数据库,字符集设置,服务设置
- sql点滴40—mysql乱码问题总结
- mysql中模糊查询的四种用法介绍
- mysql如何根据汉字首字母排序
- Mysql存储过程和函数区别介绍
- MYSQL跨服务器同步数据经验分享
- 在Mysql上创建数据表实例代码
- mysql unix准换时间格式查找指定日期数据代码
- MySQL主从复制配置
- mysql_cluster
- 用net start mysql , 提示发生系统错误 5;拒绝访问!
- 关于mysql 隐式转换的一个小问题
- mysql主从数据库服务器搭建
- Win7系统安装MySQL5.5.21图解
- 记mysql下提权不成功的一次学习
- MAC mysql安装及设置
- mysql 当字段值为NULL时,显示为特定值
- mysql表分区
- mysql 树形数据,层级数据Managing Hierarchical Data in MySQL
- 数据库MySQL与xls文件的互导