jdbc查询超大数据集内存溢出

今天使用jdbc的PreparedStatement查询语句如下:

 

 

总是报这个错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at com.mysql.jdbc.Buffer.getBytes(Buffer.java:198)
 at com.mysql.jdbc.Buffer.readLenByteArray(Buffer.java:318)
 at com.mysql.jdbc.MysqlIO.extractNativeEncodedColumn(MysqlIO.java:3567)
 at com.mysql.jdbc.MysqlIO.unpackBinaryResultSetRow(MysqlIO.java:3483)
 at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1391)
 at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2369)
 at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:451)
 at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2076)
 at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1451)
 at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1314)
 at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:740)
 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)

 

但是从网上找到的doc说,默认情况下不会出这个问题的,因为java回自动的优化不会导致内存溢出的。百思不得其解。

后来无意找到一个介绍,这么来做

就是给url连接字符串添加2个属性即可:useCursorFetch=true&defaultFetchSize=100

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 数据库查询是应用程序与数据交互的关键环节,若一次性从数据库中获取大量数据,易导致内存溢出,即程序申请内存时,因系统资源限制或程序设计不当,无法分配到足够内存空间来完成操作。服务器内存负担过重,系统可能崩溃。以下是解决该问题的多种方法: 分页查询:这是常用方法,通过设定分页参数,每次仅加载一定数量数据,减少一次性加载量。如在SQL中,可用LIMIT或OFFSET关键词实现。 流式查询:允许数据库在结果集未完全生成时就开始返回数据,而非等待所有结果计算完毕。如JavaJDBC,其ResultSet的scrollable特性,可在获取数据同时释放已读取数据,避免一次性加载全部数据。 数据预处理:可将大查询拆分为多个小查询,分别处理,或运用子查询、连接查询等优化策略,减少单次查询数据量。 提升硬件配置:增加服务器内存大小,提升数据库处理大数据能力,但这只是临时方案,无法从根本上解决问题。 数据库优化:对数据库进行索引优化,提高查询效率;使用存储过程或视图封装复杂查询,减少客户端与服务器间通信开销。 引入缓存机制:借助缓存技术(如Redis或Memcached)存储部分数据,减轻数据库压力。对于频繁访问且不常变更的数据,缓存可显著提升性能。 使用数据压缩:在查询过程中,对返回数据进行压缩处理,减少传输数据量。像MySQL等数据库提供压缩协议,可在不影响业务情况下降低内存占用。 实施数据归档:将历史数据定期归档到低成本存储介质上,仅保留最近一段时间数据供查询。 调整JVM堆内存设置:对于Java应用,调整JVM的-Xms和-Xmx参数,合理设定堆内存大小,防止内存溢出。 代码优化:编程时避免集合类无限制增长,及时释放不再使用的对象,减少内存泄露可能。 解决数据库一次查询数据量过大导致的内存溢出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值