在我们的项目开发中,可能有把SQL查询的结果保存到CSV然后提供下载的功能。当查询的结果集相当大的时候,很容易报内存不足错误(outofmemory)。那该怎么解决这种情况的内存不足错误呢?

其实在JAVA的Statement中提供的方法可以解决这个问题。

setMaxRows (int max) : 将此 Statement 对象生成的所有 ResultSet 对象可以包含的最大行数限制设置为给定数。

setFetchSize (int rows) :为 JDBC 驱动程序提供一个提示,它提示此 Statement 生成的 ResultSet对象需要更多行时应该从数据库获取的行数。

setFetchDirection (int direction) :向驱动程序提供关于方向的提示,在使用此 Statement 对象创建的 ResultSet 对象中将按该方向处理行。可以设置的参数是ResultSet.FETCH_FORWARDResultSet.FETCH_REVERSE 和 ResultSet.FETCH_UNKNOWN。

setMaxRows方法的话是取得最大行,最大以后的数据会被丢掉。设置这个参数虽然可以避免报内存错误,不过在很多场合没法使用,因为查询的结果肯定想完整的抽取出来的情况很多。这个方法和limit类似。

setFetchSize方法的话是JDBC查询和从结果集里面每次取设置行数,循环去取,直到取完。这个方法很常用的方法。默认是size是0.也就是默认是一次性把结果集的数据全部取出来,这样就容易造成内存不足。这个方法好像在自动提交模式下无效,需设置autocommit为false。

setFetchDirection方法是设置从结果集中取数据的方向,有时候我们想从最后面往前取数据,用这个方法很方便,虽然sort可以实现同样的功能,但这个方法比order by sort更有效率。

JDBC的fetchsize和maxrows的更多相关文章

  1. 聊聊jdbc statement的fetchSize

    在使用MySQL的JDBC时,如果查询结果集过大,使用一次查询,可能会出现Java.lang.OutOfMemoryError: Java heap space问题,因为DB服务器端一次将查询到的结果 ...

  2. Spring JDBC最佳实践(2)

    原文地址:https://my.oschina.net/u/218421/blog/38576 使用DataSourceUtils进行Connection的管理由上节代码可知,JdbcTemplate ...

  3. SpringJDBC解析2-execute方法

    大家都使用过JDBCTEMPLATE的execute方法,execute作为数据库操作的核心入口,将大多数数据库操作相同的步骤统一封装,而将个性化的操作使用参数PreparedStatementCal ...

  4. spring jdbctemplate源码跟踪

    闲着没事,看看源码也是一种乐趣! java操作数据库的基本步骤都是类似的: 1. 建立数据库连接 2. 创建Connection 3. 创建statement或者preparedStateement ...

  5. 关于写的Java书籍进展

    大家好,去年说要写本Java书,近期就快出版了.眼下已经開始打印样书了,最快于本月中旬左右就能够在互动网www.china-pub.com上看到消息,其它各个站点何时会发售要看详细进货情况. 去年我预 ...

  6. pgjdbc源码分析

    一. 源代码目录结构 pgjdbc的源码结构如下图: 那么我们来一一看看各个模块都是做什么的吧. 1 core 该目录是程序的核心模块目录. 这里实现了大部分pgjdbc的基类和接口,例如statem ...

  7. SpringBoot标准Properties

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...

  8. spring boot application.properties 属性详解

    2019年3月21日17:09:59 英文原版: https://docs.spring.io/spring-boot/docs/current/reference/html/common-appli ...

  9. 附录A application.properties配置项

    摘自官网,仅作为参考用 Part X. Appendices # =================================================================== ...

随机推荐

  1. contents属性

    CALayer 有一个属性叫做contents,这个属性的类型被定义为id,意味着它可以是任何类型的对象.在这种情况下,你可以给contents属性赋任何值,你的app仍然能够编译通过.但是,在实践中 ...

  2. Opencv实现两幅图像融合

    实现两幅图像线性(不同系数下)的融合涉及到Opencv中两个关键的方法,addWeighted()和createTrackbar() addWeighted方法: 函数原型: void addWeig ...

  3. HDU4188:RealPhobia (连分数的运用之一)

    Bert is a programmer with a real fear of floating point arithmetic. Bert has quite successfully used ...

  4. 为什么python2.7中用Process创建子进程的语句之前必须加#if

    from multiprocessing import Process import os def run(name): print 'The child process '%s' (pid %d) ...

  5. bzoj1911 [Apio2010]特别行动队——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1911 相当明显的斜率优化,很好做: 注意slp里面要有(double),以免出现精度问题. ...

  6. Java中Semaphore(信号量) 数据库连接池

    计数信号量用来控制同时访问某个特定资源的操作数或同时执行某个指定操作的数量 A counting semaphore.Conceptually, a semaphore maintains a set ...

  7. 041--Jquery

    一.Jquery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象.jQuery 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 jQuer ...

  8. linux下svn的建库以及相关配置

    1.安装svn软件 yum install subversion -y 2.建立库的根目录,此目录下为所有库的根目录(路径为:/home/svn-server/) ,然后进入此目录 mkdir /ho ...

  9. ObjectARX学习笔记

    http://blog.csdn.net/jangdong/article/category/1642265/3 http://blog.csdn.net/u011331383/article/cat ...

  10. Codeforces 快速竞技#4

    快速竞技#4 A–Duff and Meat588A = =这题不知道怎么写题解了.. 直接上code---. #include<bits/stdc++.h> #include<st ...