关闭的连接: next

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

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

代码如下:

Java代码  

  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. }

Java代码  

  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数据库连接池,我的配置如下:

Xml代码  

  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里面能关闭数据库连接的配置有两个分别如下:

Xml代码  

  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分钟一般来说都不够,除非你的项目非常小,数据量非常少而且查询数据后的处理业务逻辑非常简单)。更改后的配置如下。

Xml代码  

  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配置详解。

时间: 2024-11-09 01:00:06

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

netty 处理远程主机强制关闭一个连接

netty   处理远程主机强制关闭一个连接,首先看下api解释: /**  * Returns {@code true} if and only if the channel should not close itself when its remote  * peer shuts down output to make the connection half-closed.  If {@code false}, the connection  * is closed automaticall

微信小程序关闭WebSocket连接wx.closeSocket()

wx.closeSocket() ? 关闭WebSocket连接 wx.onSocketClose(CALLBACK) ? 监听WebSocket关闭 wx.connectSocket({ url:"qkxue.net" }); //注意这里有时序问题, //如果wx.connectSocket还没回调wx.onSocketOpen,而先调用wx.closeSocket,那么就做不到关闭WebSocket的目的 //必须在WebSocket打开期间调用wx.closeSocket才能关

COMET 异步通知服务器关闭数据连接实现思路

在小编络络 COMET实践笔记一文中注意事项中有这么一段话 使用长连接时, 存在一个很常见的场景:客户端需要关闭页 面,而服务器端还处在读取数据的阻塞状态,客户端需要及时通知服务器端关闭数据连接.服务器在收到关闭请求后首先要从读取数据的阻塞状态唤醒,然后释放为 这个客户端分配的资源,再关闭连接.所以在设计上,我们需要使客户端的控制请求和数据请求使用不同的 HTTP 连接,才能使控制请求不会被阻塞.在实现上,如果是基于 iframe 流方式的长连接,客户端页面需要使用两个 iframe,一个是控制

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

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

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

一,持久连接 什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭. 当Client发送下一个请求时,需要重新再建立HTTP连接,这种方式就是:一个请求响应需要占用一条HTTP连接.而持久连接就是:只需要建立一条连接,然后在这条连接上 传输多个请求和响应. 与持久连接相关的字段 HTTP1.0中有一个Connection首部字段,它是一个逐跳首部字段.Connection:Keep-

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

程序如果长时间不进行数据库操作,那么数据源中的 Connection 很可能已经断开.其原因有可能是防火墙,或者连接的数据库设置的超时时间.这里使用的是 C3P0 连接 oracle 数据库,引起的异常信息为: org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.Transac

linux关闭ssh连接

 linux 关闭SSH 连接用户 1.查明登陆端口: # who root pts/1 Apr 8 00:06 (172.29.0.29) root pts/2 Apr 8 04:15 (172.29.0.21) 2.通知该用户将要关闭他: # echo "I will close your connection" > /dev/pts/2 这样他的终端将显示该信息. 3.关闭用户连接 # fuser -k /dev/pts/2

猎豹MFC--CFile类家族介绍ADO连接数据库 打开数据库 关闭数据库 连接字符串

  ODBC最古老,但到今天还在使用.偶尔使用. DAO  和RDO  为旧接口. OLE DB新,复杂  微软 出了ADO. VC++   +  ADO是主流: MySQL  和Oracle都有专用接口. ADO底层是OLE DB实现.ADO是COM组件. ADO 专用文件夹: 要用msADO15.dll 打开stdafx.h头文件:在其内导入该库: 在初始化实例时  初始化ADO: 下面都是COM编程要求做的: windows内部大量使用COM. 异常处理: 然后整个项目就可以使用ADO了.

Linux使用screen实现关闭ssh连接的情况下,让程序继续在后台运行

Ubuntu默认没有安装screen,需要手动安装. 安装命令: sudo apt-get install screen 简单的操作方法: 直接输入命令 screen 进入screen子界面,此时putty标题栏会指示处于子界面状态,然后运行你的程序 操作命令... 然后按下Ctrl+A后抬起,然后按下d键,此时切换回主界面,Putty的窗口标题栏也会指示. 此时就是断开ssh(直接关闭putty的窗口),程序仍在运行. 以后重新ssh连接后,如果要找回之前的窗口,输入 screen -ls 查