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

前言

最近公司需要时间一个数据同步的功能,如果数据量小,还好,如果数据量特别大,几十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 设置为可修改类型的参数。

时间: 2024-10-09 20:25:29

如何从pg拿出大量数据(内存不溢出)的相关文章

输入一个int型数据,计算出它在内存中存储时含1的个数

/******************************************************** 输入一个int型数据,计算出它在内存中存储时含1的个数 比如: 输入:5 输出:2 ********************************************************/ #include<iostream> int CountOne(int num) { int count = 0; while(num){ count++; num = num&am

10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 关于中位数:数据排序后,位置在最中间的数值.即将数据分成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了). 分析:明显是一道工

10G 个整数找出中位数,内存限制为 2G

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 关于中位数:数据排序后,位置在最中间的数值.即将数据分 成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了). 分析:明显是一道

JAVA 大数据内存耗用测试

JAVA 大数据内存耗用测试import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean; public class MemoryTest { public static void main(String[] args) throws InterruptedException { int row = 50_000; int column = 20; String[] data = ne

找出缺数据的月份

declare @last table(year1 varchar(100),companycode1 varchar(100),lastmonth varchar(100))declare @now table(year varchar(100),companycode varchar(100), month varchar(100))declare @temp table(month varchar(100));declare @year intset @year=2009insert in

两个有序数组找出相同数据

两个有序数组找出相同数据,要求最简单的算法复杂度. class Program { static void Main(string[] args) { int Low = 0; int[] m = new int[] { 2, 4, 6, 9, 12, 13, 15, 16 }; int[] n = new int[] { 3, 5, 9, 12, 15 }; foreach (int item in m) { Search(n, ref Low, n.Length - 1, item); }

C++ 管理数据内存的方法

C++有3种管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆heap) 1. 自动存储 自动变量是一个局部变量,作用域为包含它的代码块. 自动变量通常存储在栈中,执行代码块时,其中的变量依次加入到栈中,离开代码块时,按相反的顺序释放这些变量,这被称为后进先出(LIFO). 2. 静态存储 静态存储是整个程序执行期间都存在的存储方式.使变量成为静态的方式有两种:一种是在函数外定义:一种是在声明变量时使用关键字static. 3. 动态存储 指由new和delete管理的

sql语句中查询出的数据添加一列,并且添加默认值

查询出数据,并且要添加一列表中都不存在的数据,且这一列的值都是相等的 select app_id,app_secret from wx_ticket group by app_id; 查询出的数据是 app_id | expires_in --------------------+------------ wxeec89cdf2d435d10 | 7200 wxeec89cdf2d435d10 | 7200 wx9b7bfb5f59df5009 | 7200 wx9b7bfb5f59df5009

数据内存分配方式

////////////////////////////////////// /// 数据内存分配方式,低字节在前,高字节在后 ////////////////////////////////////// #include <iostream> using namespace std; struct stData { union { struct { char b1; char b2; }; short s; }; }; int main() { stData data; data.b1 =