`
fengpeng
  • 浏览: 103113 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何在关闭数据库链接时,自动关闭由该链接创建的所有Statement

    博客分类:
  • jsp
阅读更多
关键字: 企业应用       

前提条件:
1 使用连接池
2 使用了spring的ioc,即DAO是单例的

提出这个问题是由于我们系统中的实际出现的状况
由于开发人员众多,素质参差不齐,开发时间紧迫,
出现了大量的不符合规范的代码以及错误代码.
常见的就是 在关闭链接的时候没有关闭链接的创建的所有的Statement
(关闭了部分,但不是所有)

所以想和 大家探讨一下该如何在代码层次实现关闭数据库链接时,自动关闭由该链接创建的所有的Statement.
我的思路是这样的

将"当前线程+当前链接"创建的所有Statement 放入一个ThreadLocal 对象内.
当关闭链接时, 从ThreadLocal 对象取出 所有的 Statement ,逐个关闭.

不知道这样的思路是否可行.
下面附上代码:

为了阅读方便没有写出全部的创建Statement的方法

代码
  1.   
  2. public class ConnectionUtils {   
  3.     public static final ThreadLocal statementMap = new ThreadLocal();   
  4.   
  5.     public static void initStatementMap(Connection conn){   
  6.         String key=String.valueOf(conn);   
  7.         Map map=(Map)statementMap.get();   
  8.         if (map==null){   
  9.             map=Collections.synchronizedMap(new HashMap());   
  10.             statementMap.set(map);   
  11.         }   
  12.         if (map.get(key)==null) {   
  13.             map.put(key, new ArrayList());   
  14.         }   
  15.     }   
  16.        
  17.     public static   void putStatement(Connection conn,Statement statement){   
  18.         Map map=(Map)statementMap.get();   
  19.         List list=(List)map.get(conn.toString());   
  20.         list.add(statement);   
  21.     }   
  22.        
  23.     public static   void closeAllStatement(Connection conn){   
  24.         Map map=(Map)statementMap.get();   
  25.         List list=(List)map.get(conn.toString());   
  26.         for (Iterator itor=list.iterator();itor.hasNext();){   
  27.             Statement stm=(Statement)itor.next();   
  28.             try {   
  29.                 stm.close();   
  30.             } catch (SQLException e) {   
  31.             }   
  32.         }   
  33.     }   
  34.        
  35.     public static Statement createStatement(Connection conn) throws SQLException{   
  36.         Statement statement=conn.createStatement();   
  37.         putStatement(conn,statement);   
  38.         return statement;   
  39.     }   
  40.        
  41.   
  42.     public static  CallableStatement prepareCall(Connection conn, String sql) throws SQLException {   
  43.         CallableStatement statement=conn.prepareCall(sql);   
  44.         putStatement(conn,statement);   
  45.         return statement;   
  46.     }   
  47.   
  48.     public static   PreparedStatement prepareStatement(Connection conn, String sql) throws SQLException{   
  49.         PreparedStatement statement= conn.prepareStatement(sql);   
  50.         putStatement(conn,statement);   
  51.         return statement;   
  52.     }   
  53.   
  54. }   
<script>render_code();</script>

 

在dao内的getConnection时 可以这么写

代码
  1. protected final Connection getConnection(){   
  2.     Connection conn=DataSourceUtils.getConnection(getDataSource());   
  3.     ConnectionUtils.initStatementMap(conn);   
  4.     return conn;   
  5. }   
<script>render_code();</script>

 

关闭Connection时 可以这么写

代码
  1. protected final void closeConnection(Connection conn) {   
  2.     ConnectionUtils.closeAllStatement(conn);   
  3.     DataSourceUtils.releaseConnection(conn, getDataSource());   
  4. }   
<script>render_code();</script>

 

要创建Statement时可以这么写

代码
  1. pstmt = ConnectionUtils.prepareStatement(conn,bufSql.toString());   
<script>render_code();</script>

 

以上只是我的一些思路,虽然在本机测试是可以的,但是不知道到底实际上是否可行
还请看看 谢谢了

分享到:
评论

相关推荐

    java测试数据库连接关闭

    // 结果集、Statement和Connection将在try块结束时自动关闭 } catch (SQLException e) { e.printStackTrace(); } ``` 在上述代码中,即使在处理结果集或执行SQL时出现异常,try-with-resources语句也会确保所有...

    数据库链接模板

    在IT行业中,数据库链接模板是实现Java应用程序与数据库交互的一种常用方法。这个主题涉及到Java的JDBC(Java Database Connectivity)API,它允许开发者编写能够连接、查询和操作各种数据库的代码。下面将详细阐述...

    JDBC 数据库链接数 据库链接操作实例

    本实例主要关注如何使用JDBC进行数据库链接操作,我们将深入探讨JDBC的核心概念、数据库连接步骤以及在实际应用中的注意事项。 首先,JDBC提供了四个核心接口,它们分别是DriverManager、Connection、Statement和...

    JSP数据库链接、增删改实现

    例如,使用`connection.setAutoCommit(false)`关闭自动提交,然后在所有操作成功后调用`connection.commit()`提交事务,否则调用`connection.rollback()`回滚。 9. **安全性**:确保对用户输入进行验证和清理,避免...

    Oracle数据库链接建立技巧与实例讲解[参考].pdf

    在创建数据库链接时,我们需要遵循一些步骤和技巧。 首先,创建数据库链接需要有`CREATE DATABASE LINK`系统权限。例如,若要在本地数据库(如SCOTT账户)上创建到远程数据库(服务名为MYDB_REMOTE)的链接,可以...

    java对各种数据库的链接及用法个人笔记

    - 创建Statement或PreparedStatement对象来执行SQL语句。 - Statement用于简单、静态的SQL语句,而PreparedStatement支持预编译的SQL,可以防止SQL注入,适用于动态SQL。 - 使用Statement或PreparedStatement的...

    JAVA链接数据库的通用方法类

    此外,为了提高代码的可读性和可维护性,可以考虑使用try-with-resources语句,它能自动关闭实现了AutoCloseable接口的资源,如: ```java try (Connection conn = getConnection(); PreparedStatement pstmt = ...

    使用jdbc链接数据库进行操作 包括数据库链接池的使用 以及CP30链接池插件的使用

    3. 创建Statement或PreparedStatement对象:Statement用于执行静态SQL语句,PreparedStatement用于预编译SQL语句,提高执行效率并防止SQL注入。 4. 执行SQL:调用Statement或PreparedStatement的executeQuery()或...

    JDBC链接数据库代码

    3. **创建Statement**:`Connection`对象可以用来创建`Statement`或`PreparedStatement`,用于执行SQL语句。 4. **执行SQL**:使用`executeQuery()`或`executeUpdate()`方法执行查询或更新操作。 5. **处理结果**...

    常用数据库的链接方式(java)

    4. **创建Statement或PreparedStatement**: - `Statement`用于执行静态SQL语句,适合简单的查询。例如:`Statement stmt = conn.createStatement();` - `PreparedStatement`预编译SQL语句,支持参数化,提高性能...

    jdbc配置 数据库链接语句

    通过调用`Connection`对象的`setAutoCommit(false)`来禁用自动提交,然后在所有操作完成后调用`commit()`,或者在出现错误时调用`rollback()`。 **异常处理** 在JDBC编程中,必须捕获并处理可能抛出的异常,如`...

    Java数据库链接代码

    记得在完成所有操作后关闭Statement、ResultSet和Connection,以释放资源。 5. **异常处理**: 在进行数据库操作时,需要捕获并处理可能抛出的SQLException,确保程序的健壮性。 6. **事务管理**: JDBC支持事务...

    java数据库链接示例

    本示例将帮助初学者理解如何在Java中建立和管理数据库链接。 首先,我们需要引入JDBC(Java Database Connectivity)API,这是Java标准版的一部分,提供了与各种数据库系统交互的接口和类。在Java项目中,通常通过...

    JDBC数据库连接JAR包

    - 创建Statement对象:根据需求选择Statement、PreparedStatement或CallableStatement,用于执行SQL语句。 - 执行SQL:调用Statement对象的`executeQuery()`或`executeUpdate()`方法执行SQL。 - 处理结果:如果...

    链接数据库

    在IT行业中,数据库链接是应用程序与数据库交互的关键环节。在这个场景中,我们关注的是"链接数据库",这通常涉及到编程语言中的数据访问技术,特别是标签中提到的"Java"。Java提供了一种强大的机制来连接并操作...

    Java链接数据库学生管理系统.rar

    3. 连接步骤:(i) 加载驱动,(ii) 建立连接,(iii) 创建Statement或PreparedStatement对象,(iv) 执行SQL,(v) 处理结果,(vi) 关闭资源。 二、学生信息管理 1. 表设计:学生信息管理可能涉及一个名为“student”的...

    JAVA链接Access数据库mdb 示例代码_access怎么连接数据库

    如果你的操作涉及多个数据库更改,可以使用`Connection`对象的`setAutoCommit(false)`方法关闭自动提交,然后在完成所有更改后调用`commit()`。如果发生错误,调用`rollback()`回滚事务。 6. 关闭连接: 记得在...

    Oracle 12c 数据库链接驱动包。ojdbc7.jar包。

    连接池预先创建并维护一定数量的数据库连接,避免了频繁地打开和关闭连接。 9. **异常处理**:在处理数据库操作时,需要捕获并适当地处理 `SQLException` 及其子类,确保程序的健壮性。 10. **兼容性**:ojdbc7....

    java链接数据库驱动

    在"java所有驱动与数据库代码.rar"这个压缩包中,可能包含了各种数据库的JDBC驱动jar包,例如MySQL的`mysql-connector-java.jar`,Oracle的`ojdbc.jar`等。这些驱动包是Java程序连接对应数据库所必需的,需将其添加...

    java连接数据库代码

    - 创建Statement/PreparedStatement对象:用于执行SQL语句。 - 执行SQL:调用Statement/PreparedStatement的`executeQuery()`或`executeUpdate()`方法。 - 处理结果:对于查询结果,可以使用ResultSet对象进行...

Global site tag (gtag.js) - Google Analytics