1.背景:
? ? ? ? ? 常见数据应用里面会有数据下载功能,当数据量比较大的时候,用JDBC 不错参数处理,容易OOM
?
2.原因:
? ? ? ? ? 基本的Connetion 做查询,ResultSet 会将数据全部拉到内存再进行遍历,所以容易OOM
?
3.当我们查询的时候利用
? ?
class="java" name="code">PreparedStatement ps = connection.prepareStatement(sqlText,ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); // 拉到多少就行处理 ps.setFetchSize(1); // ResultSet.TYPE_FORWARD_ONLY,1003 1004 1005 // TYPE_FORWARD_ONLY一般是默认,不同数据库有差异。具体解释自己网上看 // 用的pg数数据库,关闭自动提交才会生效 connection.setAutoCommit(false);
?
?
4.关于配合spring+ibatis:
? ? ? ? ??
// SqlSessionFactory 里面有 SqlSession openSession(boolean autoCommit); // 实际实现: // SpringManagedTransactionFactory @Override public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) { return new SpringManagedTransaction(dataSource); } // 发现并没有使用到autoCommit // 因此手动设置了才生效,这里其实不太明白,为啥这里只用2个参数 // ibatis 版本,1.3.2 spring-cloud 2.0 SqlSession sqlSession = sqlSessionFactory.openSession() sqlSession.getConnection().setAutoCommit(false);
?
?
?
5.不同的数据库、版本之间有差异,要再看看,多测试一下
?
?
6. 小结:
? ? ? 1. 历史经验不一定可靠,得自己测试才知道
? ? ? 2.仅仅简单记录一下,有问题可以留言指出