欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jdbc 大数据量下载

程序员文章站 2022-03-06 18:34:46
...

1.背景:

          常见数据应用里面会有数据下载功能,当数据量比较大的时候,用JDBC 不对参数处理,容易OOM

 

2.原因:

          基本的Connetion 做查询,ResultSet 会将数据全部拉到内存再进行遍历,所以容易OOM

 

3.当我们查询的时候利用

   

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