最近在写一个抽取程序, 会频繁操作数据库,我写了个类封装数据操作,下面截取部分代码如下:
- /**
- * 查询
- * @更新时间:2009-2-22
- * @更新作者:jackyli
- * @param sql 所要查询的sql语句
- * @param rsh ResultSet处理类,可自己实现接口org.apache.commons.dbutils.ResultSetHandler,也可使用一些常用的实现类,如:
- *
- * @return
- * @throws SQLException
- */
- public static Object query(final String sql, ResultSetHandler rsh) throws SQLException{
- Object results =null;
- DbUtils.loadDriver(DBInfoConstants.getDriverName());
- QueryRunner qr = new QueryRunner();
- Connection conn = null;
- try {
- conn = ConnUtils.getConn();
- results = qr.query(conn, sql,rsh);
-
- } finally{
- //关闭数据库连接
- DbUtils.commitAndCloseQuietly(conn);
-
- }
-
- return results;
- }
复制代码
抽取程序一直执行,一大概操作过1000以上后,就会出现数据库连接耗尽,程序已无法取到连接;
这时,我也开始怀疑每次操作的数据库连接,肯定都没有真正关闭并释放掉; 但又找不到原因来解释为什么会没有关掉数据库的连接对象,我也查看了DbUtils包的源码,里面也确实是调用了Connection对象的close方法,上面使用的这个commitAndCloseQuietly方法,是多了帮你捕获SQLException的异常。没发现什么奇怪的事情,官方的文档也是写着要关闭数据库连接直接调用close方法即可。但平常开发的系统都没有使用这么频繁的操作数据库,也不会遇到这个问题。
解决方法:
- /**
- * 查询
- * @更新时间:2009-2-22
- * @更新作者:jackyli
- * @param sql 所要查询的sql语句
- * @param rsh ResultSet处理类,可自己实现接口org.apache.commons.dbutils.ResultSetHandler,也可使用一些常用的实现类,如:
- *
- * @return
- * @throws SQLException
- */
- public static Object query(final String sql, ResultSetHandler rsh) throws SQLException{
- Object results =null;
- DbUtils.loadDriver(DBInfoConstants.getDriverName());
- QueryRunner qr = new QueryRunner();
- Connection conn = null;
- try {
- conn = ConnUtils.getConn();
- results = qr.query(conn, sql,rsh);
-
- } finally{
- //关闭数据库连接
- DbUtils.commitAndCloseQuietly(conn); conn =null;
-
- }
-
- return results;
- }
复制代码
代码更改为上面的做法,就不会再出现原来连接耗尽的情况; 两段代码的唯一差别在于,数据库连接对象调用close方法后,还把连接对象置为null;
个人决论:数据库连接对象调用close()方法关闭后,并没有马上关闭,但同时把连接对象置为null,有助于gc来回收连接对象从而加快数据库连接对象的回收吧。 |
相关推荐
数据库连接池在初始化时会创建一定数量的数据库连接并保存起来,当应用程序需要连接时,可以从池中获取一个已存在的连接,而不是每次都去新建,用完后也不立即关闭,而是归还给连接池。这样可以显著减少建立和释放...
数据库连接泄漏是指应用程序在使用完数据库连接后没有正确地关闭这些连接,导致连接池中的可用连接数量逐渐减少,最终可能耗尽所有可用连接。这种情况会严重影响系统的稳定性和响应时间。 #### 三、临时解决连接...
### 数据库连接池-连接的关闭内幕 在深入探讨数据库连接池中连接关闭的问题之前,我们首先需要了解数据库连接池的基本概念以及它在现代应用程序中的重要性。数据库连接池是一种管理多个数据库连接的方法,旨在提高...
查看 SQL Server 数据库连接数的多种方法 SQL Server 数据库连接数是一个重要的性能指标,它可以帮助数据库管理员了解当前数据库的工作负载和性能。查看数据库连接数有多种方法,本文将介绍四种不同的方法来查看 ...
* 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...
在数据库连接池的上下文中,代理类会拦截数据库连接的打开和关闭操作,实现在合适的时间点真正地打开或关闭连接,而用户仍可以像使用普通数据库连接一样操作。代理类通常会在初始化时获取真实连接,当用户调用`get...
完成操作后,别忘了关闭数据库连接以释放资源: ```易语言 数据库连接1.关闭() ``` 通过以上步骤,你可以使用易语言的数据库连接组件顺利地打开和操作Excel文件。当然,实际应用中还需要注意错误处理和异常...
当应用程序需要访问数据库时,可以直接从连接池中获取已存在的连接,使用完毕后将连接归还给连接池而非直接关闭,从而实现了连接的复用。 #### 二、数据库连接池的重要性 - **资源重用**:避免了频繁创建和销毁...
数据库连接是程序与数据库进行交互的基础,理解并掌握多种连接方式对于开发高效、稳定的系统至关重要。本文将深入探讨四种常见的数据库连接方式,分别是:JDBC(Java Database Connectivity)、ODBC(Open Database ...
3. 连接池的实现: ConnectionPool 类使用 Java.sql.Connection 类来实现数据库连接池,该类提供了多个方法来管理数据库连接,包括获取连接、关闭连接、提交事务等。 三、Java 实现数据库连接池的实现代码 以下是 ...
在IT领域,数据库连接是数据集成过程中的关键环节,特别是在使用工具如Kettle(也称为Pentaho Data Integration,简称PDI)时。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于从各种数据源抽取数据,...
数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕后归还而不是直接关闭,从而减少了频繁创建和销毁连接的开销。在.NET Core中,对于MySQL数据库...
注意:本地网络必须能正常连接到瀚高数据库 有2种方式: 本机和服务器网络 互通,可以直接连接到上文中安装的服务器端的瀚高数据库; 本机和服务器网络 不互通,则需要在本地安装瀚高数据库(可联系对方工程师远程...
在IT行业中,数据库连接与关闭是编程中的基本操作,特别是在使用C#进行Windows应用程序或Web应用程序开发时,与SQL Server数据库交互是常见的需求。本文将详细介绍C#与SQL Server 2012之间的连接和关闭过程,以及...
首先,数据库连接池是一种管理数据库连接的机制,它通过维护一组已打开的数据库连接,来减少创建和关闭连接的开销。在C#中,ADO.NET框架提供了内置的连接池功能,主要由System.Data.SqlClient命名空间下的...
3. 数据库连接接口:`DBConnection`,包含建立连接、执行SQL、关闭连接等基本操作的抽象方法。 4. 具体数据库连接类:如`MySQLConnection`、`OracleConnection`,它们实现`DBConnection`接口,提供与特定数据库交互...
注意,即使在finally块中,我们也应该确保连接被正确关闭,但实际中,由于使用了连接池,`conn.close()`并不会真正关闭连接,而是将其返回给连接池,供后续请求复用。 总的来说,数据库连接池是优化数据库访问的...
4. 释放连接:完成数据库操作后,将连接归还给连接池,而不是关闭连接。 为了确保连接池的健康运行,还需要进行定期的维护,例如: 1. 连接检查:定期检查连接的有效性,移除无效或超时的连接。 2. 连接重置:在...
### JAVA数据库连接大全 在Java开发环境中,与各种类型的数据库进行交互是一项基本需求。通过Java Database Connectivity (JDBC) API,开发者能够实现跨平台、跨数据库的通用接口,从而简化了数据库连接的过程。...