如何避免JDBC内存溢出问题

本文介绍了使用JDBC进行大数据量查询时的两种优化方法:一是针对MySQL通过URL参数使用游标方式减少内存占用;二是适用于多种数据库的分页查询策略,通过适时关闭资源避免内存溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql:

方法一:在连接mysql的URL后加两个参数:useCursorFetch=true&defaultFetchSize=100

完整形式如:jdbc:mysql://127.0.0.1:3306/aeolusdb?useUnicode=true&charsetEncoding=utf8&useCursorFetch=true&defaultFetchSize=100


此方法只针对mysql有效。

方法二:采用分页查询的方式,在不使用连接池的情况下,可采用同一个Connection对象,每执行完一次操作就关闭PreparedStatement对象和ResultSet对象。然后在下一次操作的时候,重新打开PreparedStatement对象和ResultSet对象。(注意这里必须关闭这两个对象)

 

Sqlserver和Oracle:

方法:采用分页查询的方式,在不使用连接池的情况下,可采用同一个Connection对象,每执行完一次操作就关闭PreparedStatement对象和ResultSet对象。然后在下一次操作的时候,重新打开PreparedStatement对象和ResultSet对象。

 

内部原理与探讨:

采用java的JDBC操作数据库时,默认数据缓存的方式,即将从数据库查询得到的数据先缓存到本地内存中,然后从内存中读取数据(这也是JDBC的结果集支持上下移动的原因,但Oracle提供的JDBC实现默认是不支持这种上下移动的),所以如果从数据库中得到的数据被过多的缓存在本地内存中,如果超出了内存承受的范围,就会造成内存溢出的情况。

像Mysql的方法一,使用的是URL加参数的方式,这其实是采用了Mysql的游标,数据就不会缓存在本地内存中,而是ResultSet对象指向的是数据库中的记录,即使是上亿条记录,只要网络不断,也不会出现异常情况。

像Mysql的方法而,依然采用了数据缓存的方式,但这种情况下缓存的数据量不会太对,只要PreparedStatement对象和ResultSet对象关闭了,缓存的数据也就消失了,故也不会出现内存溢出的情况。


转载于:https://www.cnblogs.com/cnzz84/p/4098798.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值