1、最近做了一个项目,扫描读取了第三方数据库的数据,结果本来在公司测试没有问题的程序在客户那边一直报如下错误:

java.sql.SQLException: 关闭的连接: next

代码如下:

  1. //第三方His数据库连接
  2. Connection connOrc = null;
  3. pst_zfy = connOrc.prepareStatement(sql);
  4. pst_drxf.setTimestamp(1, start);
  5. pst_drxf.setTimestamp(2, end);
  6. rs_drxf = pst_drxf.executeQuery();
  7. while(rs_drxf.next()){
  8. zyh = rs_drxf.getString(1);
  9. drxf = rs_drxf.getDouble(2);
  10. }
  11. }catch(Exception e){
  12. e.printStackTrace();
  13. }finally{
  14. DBConnector.close(rs_drxf, pst_drxf, connOrc);//该close()方法如下:
  15. }
  1. /**
  2. * 关闭数据库连接,释放数据库连接
  3. *
  4. * @param rs
  5. * @param pstmt
  6. * @param con
  7. */
  8. public static void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
  9. if(null != rs) {
  10. try {
  11. rs.close();
  12. } catch (SQLException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. if (null != pstmt) {
  17. try {
  18. pstmt.close();
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. if (null != con) {
  24. try {
  25. con.close();
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

一般来说,造成该错误的原因只有一个就是在调用ResultSet的next()方法时对应的Connection、PreparedStatement或者ResultSet已经关闭(调用了其close()方法)。通常来说关闭PreparedStatement和ResultSet对象,肯定是我们写的程序自己主动关闭了,至于这个错误,我们可以检查自己写的程序代码;第二个就是关闭Connection,对于这个对象的关闭,原因比较多:可能是我们自己关闭、物理网络原因造成数据库连接断开或者外部程序统一控制数据库连接出现问题等等。

分析原因:

①、提前主动关闭Connection、PreparedStatement或者ResultSet,应该不是该原因,这个错误一般大家都不会犯,即使犯了,在第一次调试后第一时间就会找出来,jdbc查询数据库数据标准流程都是:创建连接-->>执行查询-->>遍历数据-->>关闭连接、释放资源。遵循该流程应该都不会出现该低级错误。既然不是该错误,那应该与我们写的程序关系不到,应该是什么其他原因造成了数据库连接关闭,现在来找关闭Connection的其他原因。

②、检查是否是其他物理原因造成的数据库连接Connectiion关闭了,通过日志记录,打印Connection连接对象,发现数据库连接仍然能正常创建成功。说道这里,根据上面的程序,不知作为看客的您们是否发现问题所在了?

③、刚才说了,能关闭数据库连接Connection的还有统一管理数据库连接的外部插件-------数据库连接池!!这里我就用了proxool数据库连接池,我的配置如下:

  1. <proxool>
  2. <alias>orc</alias>
  3. <driver-url>
  4. jdbc:oracle:thin:@127.0.0.1:1521:his_db
  5. </driver-url>
  6. <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
  7. <driver-properties>
  8. <property name="user" value="sa" />
  9. <property name="password" value="123456" />
  10. </driver-properties>
  11. <minimum-connection-count>1</minimum-connection-count>
  12. <maximum-connection-count>20</maximum-connection-count>
  13. <house-keeping-sleep-time>30</house-keeping-sleep-time>
  14. <house-keeping-test-sql>select 0</house-keeping-test-sql>
  15. <trace>false</trace>
  16. <statistics-log-level>ERROR</statistics-log-level>
  17. </proxool>

proxool是当前非常优秀的数据库连接池工具,相信许多java开发者应该都用过它,通常配置该连接池时,许多选项都可以采用默认,无需配置,但是在特殊情况下还是要合理配置的。proxool里面能关闭数据库连接的配置有两个分别如下:

  1. <!-- 一个活动连接的最长时间,默认5分钟,单位毫秒 -->
  2. <maximum-active-time>300000</maximum-active-time>
  3. <!-- 一个连接的最长活动时间,默认4小时,单位毫秒 -->
  4. <maximum-connection-lifetime>14400000</maximum-connection-lifetime>

最长活动时间为4小时,应该不成问题,那么活动连接最长时间默认5分钟,出问题的可能性就非常大了,这个5分钟要求我们在创建数据库连接到查询完数据并关闭必须在5分钟之内完成,否则自动关闭数据库连接。经过仔细分析所查询数据库的数据,发现数据库对应表中的数据高达上亿,从这么庞大的数据中搜索查询一次数据至少需要4至5分钟,然后再遍历ResultSet进行处理,结果所耗时间远远超过了5分钟,所以出现上面的java.sql.SQLException: 关闭的连接: next这个错误也就理所当然了。

现将该配置改为15分钟(可根据自己项目的需要进行配置,建议大家都改下,5分钟一般来说都不够,除非你的项目非常小,数据量非常少而且查询数据后的处理业务逻辑非常简单)。更改后的配置如下。

  1. <proxool>
  2. <alias>orc</alias>
  3. <driver-url>
  4. jdbc:oracle:thin:@192.168.1.12:1521:bsrun
  5. </driver-url>
  6. <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
  7. <driver-properties>
  8. <property name="user" value="bsquery" />
  9. <property name="password" value="admin" />
  10. </driver-properties>
  11. <minimum-connection-count>1</minimum-connection-count>
  12. <maximum-connection-count>20</maximum-connection-count>
  13. <house-keeping-sleep-time>30</house-keeping-sleep-time>
  14. <house-keeping-test-sql>select 0</house-keeping-test-sql>
  15. <span style="color: #ff0000;"><maximum-active-time>900000</maximum-active-time></span>
  16. <trace>false</trace>
  17. <statistics-log-level>ERROR</statistics-log-level>
  18. </proxool>

有关proxool的配置,及其各种属性的作用、默认值参见我另一篇文章:proxool配置详解。

关闭的连接: next的更多相关文章

  1. HTTP的RST包与WinHttp延迟关闭TCP连接

    一.RST包也常见于断开TCP连接  几个月前用wireshark抓HTTP包发现有的网络通信在结束的时候没有使用四次握手,而是直接使用RST包.如: 在TCP协议中RST表示复位,用来异常的关闭连接 ...

  2. java.sql.SQLException: 关闭的连接 解决办法

    程序如果长时间不进行数据库操作,那么数据源中的 Connection 很可能已经断开.其原因有可能是防火墙,或者连接的数据库设置的超时时间.这里使用的是 C3P0 连接 oracle 数据库,引起的异 ...

  3. 7.1.1.关闭WebSocket连接

    7.1.定义 7.1.1.关闭WebSocket连接 为_关闭WebSocket连接_,端点需关闭底层TCP连接.端点应该使用一个方法完全地关闭TCP连接,以及TLS会话,如果合适,丢弃任何可能已经接 ...

  4. spring+ibatis问题1—— 程序报错:java.sql.SQLException: Io 异常: Connection reset by peer, socket write error; ”或“java.sql.SQLException 关闭的连接”异常

    转自:http://blog.sina.com.cn/s/blog_1549fb0710102whz2.html spring+ibatis程序测试时报错:java.sql.SQLException: ...

  5. HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接

    一,持久连接 什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭. 当Client发 ...

  6. muduo 的 shutdown() 没有直接关闭 TCP 连接?

    http://blog.csdn.net/Solstice/article/details/6208634 今天收到一位网友来信: 在 simple 中的 daytime 示例中,服务端主动关闭时调用 ...

  7. 关闭的语句: next、关闭的 Resultset: next、关闭的连接: next问题

    如果在rs.next()之前关闭了Statement或PreparedStatement,会导致下面的异常: java.sql.SQLException: 关闭的语句: next 如果在rs.next ...

  8. 远程主机关闭了连接。错误代码是 0x80070057,与远程主机通信时发生错误。错误代码是 0x80070057

    远程主机关闭了连接.错误代码是 0x80070057,与远程主机通信时发生错误.错误代码是 0x80070057突然在异常错误日志中看到这个错误,虽然在测试中发现不影响流的传输,但是不代表没错误,解决 ...

  9. golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期

    欢迎访问我的个人网站获取更佳阅读排版 golang 网络编程之如何正确关闭tcp连接以及管理它的生命周期 | yoko blog (https://pengrl.com/p/47401/) 本篇文章部 ...

随机推荐

  1. ArcGIS中生成蜂窝多边形算法解析

    近来有不少同学.都有问我关于蜂窝多边形的问题.也就是正六边形,也就是以下这个东东: 一般的问答模式例如以下: 亲们问:ArcGIS里面那个工具能够做这个东东? 虾神答:额,没有原生的工具. 亲们问:那 ...

  2. ubuntu安装wine 安装QQ

    安装最新版 wine sudo dpkg --add-architecture i386 sudo add-apt-repository ppa:wine/wine-builds sudo apt-g ...

  3. luence全文检索(数据库检索)

    注解:从数据库中查询所有数据然后放入luence中,然后在luence来检索 package com.zhu.demo; import java.io.IOException; import java ...

  4. windows 下操作目录(使用DOS命令)

    Attrib 更改单个文件或目录的属性.该命令设置或删除指派给文件或目录的只读.系统.存档.隐藏以及压缩属性. 含有下列参数的 attrib 命令仅当使用故障恢复控制台时才可用.含有不同参数的 att ...

  5. 深入理解JMM(Java内存模型) --(三)顺序一致性

    数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.Java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序. 当代码 ...

  6. 学生表、课程表、 成绩表 、教师表sql练习

    转自:http://yuncode.net/code/c_58df7a8ca687e58 1.查询“1”课程比“2”课程成绩高的所有学生的学号: SELECT t1.student_id FROM   ...

  7. Hibernate的表之间的关系

    表:A.B 一对多关系:A中的一个字段的记录(主键)引用B中的多个记录(外键) 多对一关系:A中的一个字段的记录(外键)引用B中的一个记录(主键) 一对一关系:A.B两个表的关联字段都是主键 多对多关 ...

  8. E20180120-hm

    derive vt. 得到,导出; 源于,来自; (从…中) 提取; hierarchy  n. [计] 分层,层次; 等级制度; 统治集团; 天使的级别或等级; inheritance  n. 继承 ...

  9. J20170528-ts

    断片 片断 くどい     啰嗦 アノテーション 注释 annotation

  10. linux下导入oracle数据表

    提前说明:这个是默认oracle已经安装好切数据库默认表空间已经创建好.之后将数据表dmp文件直接导入到默认表空间里(默认表空间不用再指定,因为创建数据库时已经指定默认表空间) linux命令如下: ...