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.仅仅简单记录一下,有问题可以留言指出