我在weblogic上使用spring jdbc。我把抓取大小設置爲500,以便更快地從數據庫獲取數據。但是這會導致記憶問題。這裏有一個例子:如何通過jdbc獲取數據後釋放內存
http://webmoli.com/2009/02/01/jdbc-performance-tuning-with-optimal-fetch-size/
我的問題是如何釋放這個內存?運行GC不工作,我猜測它不工作,因爲連接池中的連接已經存在。
代碼:
public List<Msisdn> getNewMsisdnsForBulkSmsId(String bulkSmsId,String scheduleId,final int msisdnCount) throws SQLException {
JdbcTemplate jdbcTemplate = getJdbcTemplate();
jdbcTemplate.setFetchSize(500);
jdbcTemplate.setMaxRows(msisdnCount);
jdbcTemplate.query("select BULKSMS_ID, ? as , STATUSSELECTDATE, DELIVERYTIME, ID, MESSAGE from ada_msisdn partition (ID_"+bulkSmsId+") where bulksms_id = ? and status = 0 and ERRORCODE = 0 and SCHEDULEID is null for update skip locked", new Object[]{scheduleId,bulkSmsId}, MsisdnRowMapper.INSTANCE);
//Also i tried to close connection and run gc, this does not free the memory too.
//jdbcTemplate.getDataSource().getConnection().close();
//System.gc();
return null;
}
當我設置提取大小爲10,堆大小爲12 MB 如果我設置提取大小爲500,堆大小爲206 MB
感謝名單
如果您使用探查器,您應該能夠看到爲什麼保留此內存。 – 2012-01-11 16:48:56
請發佈代碼。 – kosa 2012-01-11 16:49:51
似乎連接正在分配內存,在我的代碼中沒有內存泄漏:60.9% - 206 MB - 561,359 alloc。 org.springframework.jdbc.core.JdbcTemplate.query – 2012-01-11 18:32:52