`
wangyijiangshui
  • 浏览: 83683 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类

关闭的连接: next

 
阅读更多

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

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

代码如下:

//第三方His数据库连接
Connection connOrc = null;
pst_zfy = connOrc.prepareStatement(sql);
pst_drxf.setTimestamp(1, start);
pst_drxf.setTimestamp(2, end);
rs_drxf = pst_drxf.executeQuery();
while(rs_drxf.next()){
		zyh = rs_drxf.getString(1);
		drxf = rs_drxf.getDouble(2);
	}
}catch(Exception e){
	e.printStackTrace();
}finally{
	DBConnector.close(rs_drxf, pst_drxf, connOrc);//该close()方法如下:
}
/**
     * 关闭数据库连接,释放数据库连接
     * 
     * @param rs
     * @param pstmt
     * @param con
     */
    public static void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
    	if(null != rs) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (null != pstmt) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (null != con) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
    }

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

分析原因:

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

 

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

 

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

 

<proxool>
		<alias>orc</alias>
		<driver-url>
			jdbc:oracle:thin:@127.0.0.1:1521:his_db
		</driver-url>
		<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
		<driver-properties>
			<property name="user" value="sa" />
			<property name="password" value="123456" />
		</driver-properties>
		<minimum-connection-count>1</minimum-connection-count>
		<maximum-connection-count>20</maximum-connection-count>
		<house-keeping-sleep-time>30</house-keeping-sleep-time>
		<house-keeping-test-sql>select 0</house-keeping-test-sql>
		<trace>false</trace>
		<statistics-log-level>ERROR</statistics-log-level>
</proxool>

 

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

 

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

 

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

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

<proxool>
		<alias>orc</alias>
		<driver-url>
			jdbc:oracle:thin:@192.168.1.12:1521:bsrun
		</driver-url>
		<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
		<driver-properties>
			<property name="user" value="bsquery" />
			<property name="password" value="admin" />
		</driver-properties>
		<minimum-connection-count>1</minimum-connection-count>
		<maximum-connection-count>20</maximum-connection-count>
		<house-keeping-sleep-time>30</house-keeping-sleep-time>
		<house-keeping-test-sql>select 0</house-keeping-test-sql>
		<maximum-active-time>900000</maximum-active-time>
		<trace>false</trace>
		<statistics-log-level>ERROR</statistics-log-level>
</proxool>

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

 

分享到:
评论

相关推荐

    设置MyEclipse连接Oracle数据库

    单击Next按钮后,会出现Schema Details窗口。在这个窗口中,需要选中Display Selected单选按钮,以便选择要连接的数据库模式。在Selection Needed窗口中,选择SCOTT复选框,以便选择要连接的数据库用户。单击OK按钮...

    数据连接池

    * 关闭所有连接,撤销驱动程序的注册 */ public synchronized void release() { // 等待直到最后一个客户程序调用 if (--clients != 0) { return; } Enumeration&lt;DBConnectionPool&gt; allPools = pools....

    JAVA-JDBC连接数据库(查询-添加-修改-删除).doc

    5. 关闭连接,释放对象:使用 close() 方法关闭数据库连接,释放相关对象。 六、运行界面 本实验的运行界面是一个图形界面程序,包括录入、查询、判断、删除和修改等按钮。用户可以输入学号,按下回车,其他信息...

    java 连接数据库

    4. 在处理查询结果时需要注意 ResultSet 对象的关闭,以避免资源的浪费。 四、小结 Java 连接数据库是 Java 程序中非常重要的一部分。通过正确地使用相关类和方法,可以实现对数据库的操作。但是,需要注意相关的...

    TCP_IP详解卷1

    25.7.2 get-next操作 278 25.7.3 表格的访问 279 25.8 管理信息库(续) 279 25.8.1 system组 279 25.8.2 interface组 280 25.8.3 at组 281 25.8.4 ip组 282 25.8.5 icmp组 285 25.8.6 tcp组 285 25.9 其他一些例子 ...

    Mysql,SQL Server 2000,Oracle四种数据库的连接

    ! String trans(String chi) { String result = null; byte temp []; try { temp=chi.getBytes("iso-8859-1");... //关闭连接、释放资源 rst.close(); stmt.close(); con.close(); %&gt; &lt;/html&gt;

    java连接access不用jar包.doc

    最后,我们关闭了所有的连接。 Java 连接 Access 数据库不使用 Jar 包有两种方法。第一种方法是配置 ODBC 数据源,第二种方法是使用驱动程序连接到 Access 数据库。在 Java 中,我们可以使用 JDBC 连接 Access ...

    数据库连接,里面有各种数据库的连接方法

    DBConnectionManager.java //连接数据库用的 import java.sql.*; public class DBConnectionManager { private String driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"; private String url="jdbc:...

    中兴 ZXV10 H608B升级固件

    3、关闭了TR069的功能,关闭了默认无线加密模式,默认无线是开放的,需要加密自己设置! 在地址栏里输入:192.168.1.1,输入useradmin帐号 密码进入管理界面。 双击“强制开USB更新.mht”文件 用U盘恢复...

    Java连接SQL数据库实现登陆

    System.out.println("连接数据库成功。"); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); rst = stmt.executeQuery("SELECT*FROM user"); } catch (Exception e)...

    JSP分页代码-数据库连接池+JavaBean+JSP+SQL Server+JDBC3.0的数据库分页技术

    public Pagi()//定义构造器,初始化每页显示的主题数和数据库的连接。 { intPageSize=4; //每页显示的记录数目 db = new DB(); } //Countsql:总记录的Query字符串。[形式为select count(*) from tablename] //...

    全国资源包最新版下载免费使用

    2、安装数据库:一路NEXT,全部用默认 3、下载mysq图形化数据库管理软件。给个推荐软件:下载Navicat 4、安装Navicat 5、打开Navicat,新建一个数据库连接,用默认设置就好。 6、在新建好的连接上,右键新建...

    CentOS7安装及网络配置完整过程(可解决Dell R730)

    进行下面配置:vim /etc/ssh/sshd_config,取消 PermitRootLogin 的注释,其值设为 yes,重启服务:service sshd restart,暂时关闭防火墙:service iptables stop,putty 应该可以正常连接,远程控制服务器。...

    JDBC访问数据库的步骤

    数据库的连接串:“jdbc:mysql://localhost:3306/books” 用户名: “root” 密码: “111” 程序调试: import java.sql.*; public class TestJDBC { public static void main(String[] args)throws Exception {...

    club_internet日立无线路由AH4222设置方法(图文详解).doc

    9. 禁用自动隐藏信号:关闭路由器的自动隐藏信号功能。 10. 无线加密设置:设置无线加密,保护路由器的安全。 11. 保存所有设置:在完成所有设置后,务必保存所有设置,否则设置将不会生效。 在完成以上所有步骤...

    msw-nextjs-hmr:复制回购

    msw-nextjs-hmr 由于未关闭SSE连接,将MSW与Next.js一起使用会导致停止HMR /快速刷新。经过测试的环境操作系统:KDE Neon 5.2.1(基于Ubuntu 20.04) 浏览器:Chromium 89.0.4389.90,Firefox 86.0.1 Node.js:v...

    TCP-IP详解卷1:协议

    25.7.2 get-next操作 278 25.7.3 表格的访问 279 25.8 管理信息库(续) 279 25.8.1 system组 279 25.8.2 interface组 280 25.8.3 at组 281 25.8.4 ip组 282 25.8.5 icmp组 285 25.8.6 tcp组 285 25.9 其他一些例子 ...

    安装 配置和使用vSphere Data Protection 5.1.0

    * 设定时间窗口为 10 小时,然后启动时间窗口为 PM08:00 启动,AM06:00 关闭,然后点击“Save”保存这个 Time Cycle。 * 点击“Backup”页标签,然后点击“New”,之后选定好所有需要备份的内容,然后点击“Next”。...

    TCP/IP详解卷1:协议

    25.7.2 get-next操作 278 25.7.3 表格的访问 279 25.8 管理信息库(续) 279 25.8.1 system组 279 25.8.2 interface组 280 25.8.3 at组 281 25.8.4 ip组 282 25.8.5 icmp组 285 25.8.6 tcp组 285 25.9 其他一些例子 ...

    TCP-IP详解卷一:协议

    25.7.2 get-next操作 278 25.7.3 表格的访问 279 25.8 管理信息库(续) 279 25.8.1 system组 279 25.8.2 interface组 280 25.8.3 at组 281 25.8.4 ip组 282 25.8.5 icmp组 285 25.8.6 tcp组 285 25.9 其他一些例子 ...

Global site tag (gtag.js) - Google Analytics