首页 > 数据库 >Mysql_JDBC OutOfMemoryError

Mysql_JDBC OutOfMemoryError

时间:2023-04-14 11:03:42浏览次数:37  
标签:JDBC mysql Mysql Server Statement MySQL OutOfMemoryError fetchSize

MySQL的JDBC OutOfMemoryError: Java heap space异常
        MySql数据库通过JDBC对大表进行查询时抛出java.lang.OutOfMemoryError: Java heap space异常。这是因为默认情况下,MySQL的JDBC驱动会一下子把所有row都读取下来,这在一般情况下是最优的,因为可以减少Client-Server的通信开销。但是这样也有一个问题,当数据库查询结果很大时,特别当不能全部放进内存时,就会产生性能问题。

本来,JDBC api里在Connection、Statement和ResultSet上都有设置fetchSize的方法,但是MySQL的JDBC驱动都不支持,无论你怎么设fetchSize,ResultSet都会一次性从Server读取数据。在MySQL的官方论坛上也有多个这样的问题,总结一下解决办法如下:

1.MySQL版本在5.0以上,MySQL的JDBC驱动更新到最新版本(至少5.0以上)
2.Statement一定是TYPE_FORWARD_ONLY的,并发级别是CONCUR_READ_ONLY(即创建Statement的默认参数)
3.以下两句语句选一即可:
    1).statement.setFetchSize(Integer.MIN_VALUE);
    2).((com.mysql.jdbc.Statement)stat).enableStreamingResults();

这样会一行一行地从Server读取数据,因此通信开销很大,但内存问题可以解决。官方的说法是不支持fetchSize不是MySQL的JDBC驱动的问题,而是MySQL本身就不支持。而商用数据库Oracle或DB2都是支持fetchSize的,从这里也可以看出两者的考量不同。
考虑到应用程序利用JDBC跨数据库的特性可以,通过判断mySql连接特殊处理:
      

if(conn.getClass().getName().indexOf("mysql")>0){
                 //com.mysql.jdbc.Driver
                  stmt.setFetchSize(Integer.MIN_VALUE); 
                }

标签:JDBC,mysql,Mysql,Server,Statement,MySQL,OutOfMemoryError,fetchSize
From: https://blog.51cto.com/u_16070335/6189671

相关文章

  • 使用反射按照类结构生成MySQL表
    因为一个表对应一个java类,如果java类多了,一个一个创建表太消耗时间了,同时也想造下轮子。加深下对反射和注解的使用反射和注解把java一切皆对象的思想完全的体现了出来,同时也给java提供了强大的动态性。主要进行工作的类,可以在里面加上jdbc,就可以实现自动创建表了。importjava.......
  • mysql笔记
    1.3、数据库分类关系型数据库:(sql)MySql,Oracle,SqlServer,DB2,SQLlite通过表和表之间,行和列之间的关系进行数据的存储,学员信息表,考勤表,。。。。。非关系型数据库:(NoSQL)NotOnlyRedis,MongDB非关系型数据库,对象存储,通过对象的自身属性来决定。DBMS(数据库管理系统)数据库的......
  • MySql查询语句根据年份或月份查询
    1.按年份查询select字段名from表whereyear(字段名)='年份';2.按月份查询:select字段名from表wheremonth(字段名)='月份';3.查本年的某一天(例本年的第6天)select字段名from表wheredayofyear(字段名)='6';......
  • java.lang.OutOfMemoryError- unable to create new native thread 问题排查
    问题描述最近连续两天大约凌晨3点,线上服务开始异常,出现OOM报错。且服务所在的物理机只能ping通,但是无法登录。报错信息如下:ERROR04-1203:01:43,930[DefaultQuartzScheduler_Worker-3]JobRunShell[JobRunShell]:211JobthrewanunhandledException:java.lang.OutOfMemory......
  • percona-toolkit工具:使用pt-table-checksum检查MySQL主从库的差异
    环境介绍CentOS7.6MySQL5.7PerconaToolkit3.4.0 下载并安装PerconaToolkit从WEB端下载https://www.percona.com/downloads或者通过wget下载[root]#wgethttps://downloads.percona.com/downloads/percona-toolkit/3.5.2/binary/redhat/7/x86_64/percona-toolkit-3.......
  • 快速登录任意mysql脚本
    ######################!/bin/bash#获取输入参数ip=""port=""database=""query=""password_BASE64='WldFeU1HTXhaVFkxWWpnMk56WTFNVFUyTkRObE5qazQK'while[$#-gt0]docase$1in-h)i......
  • docker 容器操作、应用部署、mysql,redis,nginx、迁移与备份、Dockerfile
    容器操作#启动容器dockerstart容器id#停止容器dockerstop容器id#文件拷贝先创建文件mkdir:文件夹vivimtouch:文件#容器的文件copy到宿主机上(不是在容器内部操作)dockercp容器名称:容器目录需要拷贝的文件或目录dockercp......
  • MySQL日志、事务原理 -- undolog、redolog、binlog、两阶段提交
        1.undolog1.1 undolog–原子性   1.2回滚日志,记录数据被修改前的信息,属于逻辑日志什么是逻辑日志?比如我们执行一条delete语句,undolog里边记录的是相反的操作insert记录【相当于存放的是操作逻辑语句,而不是数据】逻辑日志好处比如全表更新,如果......
  • mysql 数据迁移与查询更新
    业务前景:在旧表中新增ch类型字段,以ch字段作为查询条件,为了不产生影响,需要对ch字段进行更新操作,ch字段源于base字段json格式中的一部分。  解决方案:1) 字段迁移updatereported_datasetch=base; 2)查询后更新updatereported_datasetch=(SELECTSUBS......
  • zabbix监控远程MySQL数据库
    zabbix_agent客户端操作:1.数据库用户授权登录mysqlmysql>grantallon*.*tozabbix@'localhost'identifiedby"123";mysql>flushprivileges;2.cp模板到/usr/local/zabbix/etc/zabbix_agentd.conf.d/cp/root/zabbix-4.2.6/conf/zabbix_agentd/userparamet......