前言
最近公司需要时间一个数据同步的功能,如果数据量小,还好,如果数据量特别大,几十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