码迷,mamicode.com
首页 > 其他好文 > 详细

如何从pg拿出大量数据(内存不溢出)

时间:2015-10-10 19:59:02      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

前言

最近公司需要时间一个数据同步的功能,如果数据量小,还好,如果数据量特别大,几十G,那么发现Java虚拟机频繁GC,甚至内存溢出。

方案

以前使用的方法:

PreparedStatement  statement = con.prepareStatement("select * from table1");

那么当读取数据的时候,(厂商不同,办法不同)Postgresql的Jdbc将内存全部读取到内存,导致内存溢出。解决的办法是设置每次读取数据的条数,比如:statement.setFetchSize(200);并且修改脚本:

PreparedStatement statement = connection.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

这样就能够在读取数据的时候,不是一次缓存全部的数据到内存,而是每次读取部分的数据。

附:

Statement st = conn.createStatement(intresultSetType, intresultSetConcurrency)   
ResultSetrs = st.executeQuery(sqlStr) 

其中两个参数的意义是: 

  resultSetType是设置ResultSet对象的类型是否可以滚动。取值如下:

  • ResultSet.TYPE_FORWARD_ONLY只能向前滚动;
  • ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE这两个方法都能够实现任意的前后滚动,可以使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感.。

  resultSetConcurency是设置ResultSet对象是否能够感知修改,取值如下:   ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数;ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。

如何从pg拿出大量数据(内存不溢出)

标签:

原文地址:http://www.cnblogs.com/liqiu/p/4868013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!