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. 【bzoj1452】[JSOI2009]Count

    二维树状数组 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ...

  2. mysql_connect 等待时间长,修改连接地址为127.0.0.1即可

    程序搬家后,运行非常慢分析流程: 1.外网的等待时间太长 2.内容等待时间也很长 3.断点查到仅仅一句 mysql_connect ("localhost",***,***)就要1 ...

  3. 简易 DBUtil 封装

    Dao包结构图: 1.首先连接数据库 package com.util.db; import java.sql.Connection; import java.sql.DriverManager; i ...

  4. 魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G.

    魏汝盼医学博士 - Judy Zhu Wei, M.D., F.A.C.O.G.         医院(诊所)名称:CAPRI妇产科诊所 妇产科,华人医生,微创妇科手术专科医生,女医生,fountai ...

  5. POJ2208 Pyramids 四面体体积

    POJ2208给定四面体六条棱(有序)的长度 求体积 显然用高中立体几何的方法就可以解决. 给出代码 #include<iostream> #include<cstdio> # ...

  6. 杂项-Java:JeePlus

    ylbtech-杂项-Java:JeePlus 一个集成了代码生成器的java快速开发框架 1. 介绍返回顶部 1. 响应式开发 JeePlus采用了目前极为流行的扁平化响应式的设计风格,UI框架使用 ...

  7. C#面向过程之编译原理、变量、运算符

    .net基础:.net与C# .net是一个平台 c#是一门语言 .net的用途a.桌面应用程序 b.网站应用程序 c.专业游戏开发(XBOX360) d.嵌入式设备软件开发 e.智能手机APP开发 ...

  8. bzoj 1643: [Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪【枚举】

    4维枚举平方小于10000的数,相加等于n则ans++ #include<iostream> #include<cstdio> using namespace std; con ...

  9. [App Store Connect帮助]六、测试 Beta 版本(3.3)管理测试员:查看测试员信息

    如果您使用“TestFlight Beta 版测试”,您可以查看关于测试员的信息,并衡量测试员的参与度. 必要职能:“帐户持有人”职能.“管理”职能.“App 管理”职能.“开发者”职能或“营销”职能 ...

  10. Python之列表生成式、生成器

    列表生成式 ——可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁: >>> [x * x for x in range(1, 11)] [1, 4, ...