最近在写一个抽取程序, 会频繁操作数据库,我写了个类封装数据操作,下面截取部分代码如下:
- /**
- * 查询
- * @更新时间: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...
7. **关闭连接**:完成数据库操作后,记得调用`TADOConnection.Close`关闭连接,以释放资源。 通过以上步骤,Delphi源码将能够实现Ado方式的数据库连接测试。这个过程不仅对Delphi开发者有用,对于了解数据库连接...
数据库连接池是一种用于管理数据库连接的技术,它能够预先创建多个数据库连接,并将这些连接保存在一个池中供应用程序重复使用,从而避免了频繁创建和关闭数据库连接所带来的性能开销。在实际应用中,通过合理配置...
数据库连接是程序与数据库进行交互的基础,理解并掌握多种连接方式对于开发高效、稳定的系统至关重要。本文将深入探讨四种常见的数据库连接方式,分别是:JDBC(Java Database Connectivity)、ODBC(Open Database ...
在IT领域,数据库连接是数据集成过程中的关键环节,特别是在使用工具如Kettle(也称为Pentaho Data Integration,简称PDI)时。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于从各种数据源抽取数据,...
数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕后归还而不是直接关闭,从而减少了频繁创建和销毁连接的开销。在.NET Core中,对于MySQL数据库...
本文将基于给定的信息——“数据库连接方法包括连接和关闭资源”,深入探讨SQL数据库连接的相关知识点,涵盖连接方法、资源管理及重载方法等方面。 ### 数据库连接:基本概念 数据库连接是应用程序与数据库之间...
最后,在业务逻辑完成后,确保正确关闭数据库连接。 ```java // 创建ThreadLocal对象 private static ThreadLocal<Connection> tl = new ThreadLocal(); // 获取连接 public static Connection getConnection() ...
数据库连接池预先创建并管理一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕后再归还,而不是真正关闭。这样可以显著提高性能,减少系统开销。 常见的数据库连接池实现有: - C3P0:一个开源的...
数据库连接数调整 在本篇文章中,我们将讨论如何调整数据库连接数,以解决系统不能登陆的问题。在系统中,数据库连接数是一个非常重要的参数,因为它直接影响着系统的性能和可扩展性。当数据库连接数不够时,可能会...
3. 数据库连接接口:`DBConnection`,包含建立连接、执行SQL、关闭连接等基本操作的抽象方法。 4. 具体数据库连接类:如`MySQLConnection`、`OracleConnection`,它们实现`DBConnection`接口,提供与特定数据库交互...
注意,即使在finally块中,我们也应该确保连接被正确关闭,但实际中,由于使用了连接池,`conn.close()`并不会真正关闭连接,而是将其返回给连接池,供后续请求复用。 总的来说,数据库连接池是优化数据库访问的...
在IT行业中,数据库连接是应用程序开发中的重要环节,特别是在使用Delphi这种强大的Windows应用程序开发工具时。Delphi提供了多种方式来连接和操作数据库,使得开发者能够灵活地选择适合项目需求的解决方案。以下将...