`
wangyijiangshui
  • 浏览: 85458 次
  • 性别: 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配置详解。

 

分享到:
评论

相关推荐

    nextcloud最新20版本下载

    4. 优化网络环境:检查网络连接,确保带宽充足,关闭占用网络资源的其他应用。 总的来说,Nextcloud是一个强大的私人云存储解决方案,其最新版本20可能带来了更多改进和优化,对于想要自建私有云的用户来说,是一个...

    nextcloud 安装教程 windows 服务器中nextcloud 安装图解

    这个命令将 Nextcloud 服务映射到主机的 8080 端口,与 "mysql" 和 "redis" 容器建立连接,并将数据存储在主机的 "nextcloud" 共享文件夹中。 3. **配置 Nextcloud** - 初始配置完成后,可以通过 http://IP:8080 ...

    PostgreSQL JDBCL连接:postgresql-42.2.5.jar包.zip

    while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); // 处理每一行数据... } rs.close(); stmt.close(); ``` **6. 事务管理** JDBC提供了对事务的控制,可以使用`Connection...

    三种数据库的jdbc连接方式小例子(附:数据库文件)

    5. 处理结果集并关闭资源:`while (rs.next()) {...}; rs.close(); stmt.close(); conn.close();` 三、Oracle的JDBC连接 Oracle数据库通常使用Oracle JDBC驱动`ojdbc.jar`。连接步骤如下: 1. 加载驱动:`Class....

    数据库连接方法包括连接和关闭资源

    本文将基于给定的信息——“数据库连接方法包括连接和关闭资源”,深入探讨SQL数据库连接的相关知识点,涵盖连接方法、资源管理及重载方法等方面。 ### 数据库连接:基本概念 数据库连接是应用程序与数据库之间...

    jdbc连接各种数据库

    此外,获取数据库资源,如执行SQL语句、处理结果集等,需要使用`Statement`、`PreparedStatement`或`CallableStatement`对象,并且要注意关闭资源以防止内存泄漏。例如: ```java Statement stmt = conn....

    nextcloud部署文档

    同时,需要关闭防火墙和 SELinux,以确保 Nextcloud 的正确安装和运行。 安装依赖组件 首先,需要安装一些必要的组件,包括 vim、wget、tree 和 unzip。然后,需要安装 epel-release,以获取更多的软件包。接着,...

    java测试数据库连接关闭

    本文将深入探讨如何在Java中测试Oracle数据库的连接关闭,确保资源的有效利用和程序的稳定性。 首先,我们需要理解JDBC的基本概念。JDBC是Java平台中用于与各种数据库进行通信的标准接口。通过JDBC,Java程序员可以...

    Jdbc连接mysqldemo以及相关驱动.rar

    - 最后,关闭连接:`stmt.close(); conn.close();` 通过学习和理解这个示例,开发者可以快速掌握如何在Java应用中使用JDBC连接MySQL数据库,执行SQL操作,这对于任何Java开发者来说都是基础且实用的知识点。

    jdbc连接测试项目

    - 遍历结果:`while (rs.next()) { // 读取数据 }` - 关闭资源:`rs.close(); stmt.close(); conn.close();` 3. **项目实践** 该项目可能包含以下部分: - `JDBCProject`目录下可能有`src`源码目录,包含了Java类...

    java三种方法连接SQL数据库

    // 关闭连接 rs.close(); stmt.close(); conn.close(); ``` 2. JNDI连接: JNDI主要用于查找和管理资源,如数据库连接。在应用服务器中,通常会配置数据源,然后通过JNDI查找该数据源来获取数据库连接。 ```java ...

    get_next_line:此函数逐行读取文件的内容

    `get_next_line` 函数主要涉及到文件的读取操作,它可能使用`fopen`打开文件,`fgets`或`fread`读取一行数据,然后`fclose`关闭文件。 2. **缓冲区管理**:为了提高效率,`get_next_line`可能会使用缓冲区来存储...

    JSP连接数据库大全

    这些示例不仅提供了连接数据库的基本步骤,还涉及到了如何正确地处理数据库连接、执行SQL查询以及关闭资源等重要知识点。这对于初学者来说是非常宝贵的实践指导资料。通过学习这些示例,开发者可以更好地理解和掌握...

    VBS脚本管理本地连接的网卡禁用启用

    此方案的核心在于通过VBS脚本来查找并控制指定名称的网络连接(例如“无线网络连接”、“本地连接”),然后通过bat批处理来启动或关闭特定的服务以及执行相应的VBS脚本。整个过程分为两个主要部分: 1. **VBS脚本*...

    精彩编程与编程技巧-关闭所有的数据连接...

    ### 关闭所有数据连接的重要性及实现方法 在数据库应用程序开发中,确保所有打开的数据连接(如数据库连接、记录集等)被适当地关闭是非常重要的。这不仅有助于优化资源使用,防止内存泄漏,还能提高程序的整体性能...

    ojdbc6--oracle数据库连接驱动.rar

    5. 关闭资源:使用完毕后,记得关闭ResultSet、Statement和Connection,避免资源泄漏。 ```java rs.close(); stmt.close(); conn.close(); ``` ojdbc6驱动不仅提供了基本的数据库连接功能,还支持事务管理、批处理...

    CAA连接Sql数据库

    7. 关闭连接:使用完数据库后,记得关闭连接,释放资源。 CAA中的数据库连接可能会涉及线程安全、事务处理、错误处理等高级话题。在实际应用中,可能还需要考虑性能优化,例如批量操作、缓存策略等。 在压缩包中的...

    java测试数据库连接

    4. 使用连接并确保关闭,但连接会返回到连接池,而不是真正关闭。 总的来说,Java中的数据库连接方式多样,可以根据项目需求选择合适的方案。直接使用Java类适用于简单场景,JSP+JavaBean更适合Web应用,而连接池则...

    数据库连接与遍历Student对象

    5. 最后,记得关闭连接以释放资源:`conn.close();` 在描述中提到的“遍历Student对象”,意味着我们需要从数据库中获取一系列Student对象,并对它们进行处理。这可能涉及使用SQL查询语句,例如`SELECT * FROM ...

    web项目数据库连接样例

    使用JDBC的基本步骤包括加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL语句、处理结果集和关闭资源。 三、配置数据库连接参数 在Web项目中,通常会将数据库连接参数(如URL、用户名、密码)...

Global site tag (gtag.js) - Google Analytics