Mysql中使用JDBC流式查询避免数据量过大导致OOM

摘要:
三、结果对比对于同一个sqlCmd,同一批数据,使用两种方式占用内存对比如下:非流式编程image.png流式编程image.png另外非流式方式由于是把符合条件的数据一下子全部加在到内存,并且由于数据量比较大,需要mysql处理的时间比较长,我测试情况下需要一分钟才会返回结果到内存,然后才能通过数据集返回数据。
一、前言

java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM。

二、如何使用

2.1 之前查询

public void selectData(String sqlCmd) throwsSQLException {

    validate(sqlCmd);

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    try{

        
        conn =petadataSource.getConnection();
        stmt =conn.prepareStatement(sqlCmd);
        rs =stmt.executeQuery();

        try{
            while(rs.next()){
                try{
                    System.out.println("one:" + rs.getString(1) + "two:" + rs.getString(2) + "thrid:" + rs.getString(3));
                } catch(SQLException e) {
                    //TODO Auto-generated catch block
e.printStackTrace();
                }
            }
        } catch(SQLException e) {
            //TODO Auto-generated catch block
e.printStackTrace();
        }

        } finally{
            close(stmt, rs, conn);

        }
}

2.2 现在流式查询

public void selectData(String sqlCmd,) throwsSQLException {

    validate(sqlCmd);

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    try{

        conn =petadataSource.getConnection();
        
        stmt =conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            stmt.setFetchSize(Integer.MIN_VALUE);
            
        rs =stmt.executeQuery();

        try{
            while(rs.next()){
                try{
                    System.out.println("one:" + rs.getString(1) + "two:" + rs.getString(2) + "thrid:" + rs.getString(3));
                } catch(SQLException e) {
                    //TODO Auto-generated catch block
e.printStackTrace();
                }
            }
        } catch(SQLException e) {
            //TODO Auto-generated catch block
e.printStackTrace();
        }

        } finally{
            close(stmt, rs, conn);

        }
}

可知只是prepareStatement时候改变了参数,并且设置了PreparedStatement的fetchsize为Integer.MIN_VALUE。三、 结果对比对于同一个sqlCmd,同一批数据,使用两种方式占用内存对比如下:

  • 非流式编程


    Mysql中使用JDBC流式查询避免数据量过大导致OOM第1张
    image.png
  • 流式编程


    Mysql中使用JDBC流式查询避免数据量过大导致OOM第2张
    image.png

另外非流式方式由于是把符合条件的数据一下子全部加在到内存,并且由于数据量比较大,需要mysql处理的时间比较长,我测试情况下需要一分钟才会返回结果到内存(数据量比较大),然后才能通过数据集返回数据。

而流式方式是每次返回一个记录到内存,所以占用内存开销比较小,并且调用后会马上可以访问数据集的数据。


--------------
转自
链接:https://www.jianshu.com/p/c1e6eeb71c74

免责声明:文章转载自《Mysql中使用JDBC流式查询避免数据量过大导致OOM》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇nodejs中Buffer的创建和转换java大文件(视频)切割上传下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

保证看完就会!大数据YARN核心知识点来袭!

01 我们一起学大数据 大家好,今天分享的是大数据YARN的核心知识点,老刘尽量用通俗易懂的话来讲述YARN知识点,争取做到大家看完后能够用口语化的形式将它们表达出来,做到真正的看完就会!(如果觉得老刘写的不错,给老刘点个赞) 02 YARN核心知识点 第1点:什么是YARN? YARN是Hadoop架构中的资源调度引擎模块,从这个模块名字就可以看出来,...

matlab学习:人脸识别之PCA( Principal Component Analysis )

1.链接推荐 关于理解PCA的推荐链接:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html 关于理解SVD的推荐链接:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-...

js 递归树结构数据查找父级

1.json树数据查找所有父级--完成 json:树结构数据 var arrData =[{ "label": "中国", "City": null, "value": "0", "children": [{ "label": "河北", "City": "0",...

选择下拉列表,出现不同数据,并计算

点击下拉框,出现缴纳电费,水费,燃气费三个选项。选择其一,下边对应的单价改变,选择数量,进行计算。 //结构 <select name="type" onchange="show_sub(this.options[this.options.selectedIndex].value)">...

如何打造高性能大数据分析平台

1.大数据是什么? 大数据是最近IT界最常用的术语之一。然而对大数据的定义也不尽相同,所有已知的论点例如结构化的和非结构化、大规模的数据等等都不够完整。大数据系统通常被认为具有数据的五个主要特征,通常称为数据的5 Vs。分别是大规模,多样性,高效性、准确性和价值性。 据Gartner称,大规模可以被定义为“在本(地)机数据采集和处理技术能力不足以为用户带来...

python用sqlite3模块操作sqlite数据库-乾颐堂

SQLite是一个包含在C库中的轻量级数据库。它并不需要独立的维护进程,并且允许使用非标准变体(nonstandard variant)的SQL查询语句来访问数据库。 一些应用可是使用SQLite保存内部数据。它也可以在构建应用原型的时候使用,以便于以后转移到更大型的数据库。 SQLite的主要优点: 1. 一致性的文件格式: 在SQLite的官方文档中是...