最近在写一个抽取程序, 会频繁操作数据库,我写了个类封装数据操作,下面截取部分代码如下:
- /**
- * 查询
- * @更新时间: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开发者有用,对于了解数据库连接...
完成操作后,别忘了关闭数据库连接以释放资源: ```易语言 数据库连接1.关闭() ``` 通过以上步骤,你可以使用易语言的数据库连接组件顺利地打开和操作Excel文件。当然,实际应用中还需要注意错误处理和异常...
数据库连接是程序与数据库进行交互的基础,理解并掌握多种连接方式对于开发高效、稳定的系统至关重要。本文将深入探讨四种常见的数据库连接方式,分别是:JDBC(Java Database Connectivity)、ODBC(Open Database ...
在IT领域,数据库连接是数据集成过程中的关键环节,特别是在使用工具如Kettle(也称为Pentaho Data Integration,简称PDI)时。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于从各种数据源抽取数据,...
注意:本地网络必须能正常连接到瀚高数据库 有2种方式: 本机和服务器网络 互通,可以直接连接到上文中安装的服务器端的瀚高数据库; 本机和服务器网络 不互通,则需要在本地安装瀚高数据库(可联系对方工程师远程...
在IT行业中,数据库连接与关闭是编程中的基本操作,特别是在使用C#进行Windows应用程序或Web应用程序开发时,与SQL Server数据库交互是常见的需求。本文将详细介绍C#与SQL Server 2012之间的连接和关闭过程,以及...
最后,在业务逻辑完成后,确保正确关闭数据库连接。 ```java // 创建ThreadLocal对象 private static ThreadLocal<Connection> tl = new ThreadLocal(); // 获取连接 public static Connection getConnection() ...
数据库连接池是一种管理数据库连接的技术,它预先初始化一定数量的数据库连接并保存在内存中,当应用程序需要连接数据库时,可以从连接池中获取一个已存在的连接,用完后再归还,而不是每次都新建和关闭连接。...
操作完成后,调用Connection对象的close()方法,实际上不是真正关闭连接,而是将其返回到连接池。 5. 关闭连接池:应用程序关闭时,调用连接池的shutdown()方法,释放所有资源。 Oracle数据库在JDBC中的使用则涉及...
注意,即使在finally块中,我们也应该确保连接被正确关闭,但实际中,由于使用了连接池,`conn.close()`并不会真正关闭连接,而是将其返回给连接池,供后续请求复用。 总的来说,数据库连接池是优化数据库访问的...
4. 释放连接:完成数据库操作后,将连接归还给连接池,而不是关闭连接。 为了确保连接池的健康运行,还需要进行定期的维护,例如: 1. 连接检查:定期检查连接的有效性,移除无效或超时的连接。 2. 连接重置:在...
然后,通过DataSource的getConnection()方法获取连接,使用完毕后调用Connection的close()方法,但实际上连接并未真正关闭,而是返回到连接池中。 **Apache DBUtils简介** Apache的DBUtils是一个简单的JDBC工具包...
《Kettle 7.1数据库连接驱动包详解与应用》 Kettle,也称为Pentaho Data Integration(PDI),是一款强大的数据集成工具,广泛应用于数据清洗、转换和加载等任务。在使用Kettle进行数据库操作时,正确配置并选用...
### JAVA数据库连接大全 在Java开发环境中,与各种类型的数据库进行交互是一项基本需求。通过Java Database Connectivity (JDBC) API,开发者能够实现跨平台、跨数据库的通用接口,从而简化了数据库连接的过程。...