最近在写一个抽取程序, 会频繁操作数据库,我写了个类封装数据操作,下面截取部分代码如下:
- /**
- * 查询
- * @更新时间: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 数据库连接数是一个重要的性能指标,它可以帮助数据库管理员了解当前数据库的工作负载和性能。查看数据库连接数有多种方法,本文将介绍四种不同的方法来查看 ...
* 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...
完成操作后,别忘了关闭数据库连接以释放资源: ```易语言 数据库连接1.关闭() ``` 通过以上步骤,你可以使用易语言的数据库连接组件顺利地打开和操作Excel文件。当然,实际应用中还需要注意错误处理和异常...
数据库连接是程序与数据库进行交互的基础,理解并掌握多种连接方式对于开发高效、稳定的系统至关重要。本文将深入探讨四种常见的数据库连接方式,分别是:JDBC(Java Database Connectivity)、ODBC(Open Database ...
数据库连接池是一种管理数据库连接的技术,它预先初始化一定数量的数据库连接并保存在内存中,当应用程序需要连接数据库时,可以从连接池中获取一个已存在的连接,用完后再归还,而不是每次都新建和关闭连接。...
注意:本地网络必须能正常连接到瀚高数据库 有2种方式: 本机和服务器网络 互通,可以直接连接到上文中安装的服务器端的瀚高数据库; 本机和服务器网络 不互通,则需要在本地安装瀚高数据库(可联系对方工程师远程...
数据库连接测试及数据查询是IT领域中常见的任务,特别是在开发和维护基于MS SQL Server的应用程序时。这个过程涉及确保应用程序能够正确地与SQL Server数据库建立连接,并执行有效的数据查询操作。下面将详细介绍这...
注意,即使在finally块中,我们也应该确保连接被正确关闭,但实际中,由于使用了连接池,`conn.close()`并不会真正关闭连接,而是将其返回给连接池,供后续请求复用。 总的来说,数据库连接池是优化数据库访问的...
在IT行业中,数据库连接是应用程序开发中的重要环节,特别是在使用Delphi这种强大的Windows应用程序开发工具时。Delphi提供了多种方式来连接和操作数据库,使得开发者能够灵活地选择适合项目需求的解决方案。以下将...
Delphi数据库连接池是一种高效的数据库资源管理技术,它允许应用程序在多用户环境下共享数据库连接,以提高性能并减少系统资源的消耗。连接池的核心思想是重用已建立的数据库连接,而不是每次需要时都创建新的连接,...
数据库连接是应用程序与数据库之间建立通信的桥梁,它允许程序执行SQL语句、查询和更新数据库中的信息。在IT行业中,数据库连接模型是至关重要的,因为它决定了数据如何被访问、处理和传输。以下是对数据库连接模型...
然后,通过DataSource的getConnection()方法获取连接,使用完毕后调用Connection的close()方法,但实际上连接并未真正关闭,而是返回到连接池中。 **Apache DBUtils简介** Apache的DBUtils是一个简单的JDBC工具包...
6. 关闭资源:最后,记得关闭`ResultSet`、`Statement`和`Connection`,释放数据库资源,防止内存泄漏。 在实际应用中,为了提高代码的可维护性和复用性,我们通常会使用`Connection Pool`(连接池)。连接池管理...
### JAVA数据库连接大全 在Java开发环境中,与各种类型的数据库进行交互是一项基本需求。通过Java Database Connectivity (JDBC) API,开发者能够实现跨平台、跨数据库的通用接口,从而简化了数据库连接的过程。...
数据库连接池,如ADO.NET中的实现,是一种复用已存在数据库连接的技术,以减少频繁创建和关闭连接带来的开销。在ADO.NET中,DataSet、DataTable、DataColumn、DataRow和DataRelation等对象用于构建和操作数据,但...
数据库连接池的出现解决了这个问题,它在应用程序启动时预创建一定数量的数据库连接,并存储在一个池中,当程序需要访问数据库时,可以从池中获取一个已经建立好的连接,使用完毕后再归还给池,而不是真正关闭连接。...