前提条件:
1 使用连接池
2 使用了spring的ioc,即DAO是单例的
提出这个问题是由于我们系统中的实际出现的状况
由于开发人员众多,素质参差不齐,开发时间紧迫,
出现了大量的不符合规范的代码以及错误代码.
常见的就是 在关闭链接的时候没有关闭链接的创建的所有的Statement
(关闭了部分,但不是所有)
所以想和 大家探讨一下该如何在代码层次实现关闭数据库链接时,自动关闭由该链接创建的所有的Statement.
我的思路是这样的
将"当前线程+当前链接"创建的所有Statement 放入一个ThreadLocal 对象内.
当关闭链接时, 从ThreadLocal 对象取出 所有的 Statement ,逐个关闭.
不知道这样的思路是否可行.
下面附上代码:
为了阅读方便没有写出全部的创建Statement的方法
代码
-
- public class ConnectionUtils {
- public static final ThreadLocal statementMap = new ThreadLocal();
-
- public static void initStatementMap(Connection conn){
- String key=String.valueOf(conn);
- Map map=(Map)statementMap.get();
- if (map==null){
- map=Collections.synchronizedMap(new HashMap());
- statementMap.set(map);
- }
- if (map.get(key)==null) {
- map.put(key, new ArrayList());
- }
- }
-
- public static void putStatement(Connection conn,Statement statement){
- Map map=(Map)statementMap.get();
- List list=(List)map.get(conn.toString());
- list.add(statement);
- }
-
- public static void closeAllStatement(Connection conn){
- Map map=(Map)statementMap.get();
- List list=(List)map.get(conn.toString());
- for (Iterator itor=list.iterator();itor.hasNext();){
- Statement stm=(Statement)itor.next();
- try {
- stm.close();
- } catch (SQLException e) {
- }
- }
- }
-
- public static Statement createStatement(Connection conn) throws SQLException{
- Statement statement=conn.createStatement();
- putStatement(conn,statement);
- return statement;
- }
-
-
- public static CallableStatement prepareCall(Connection conn, String sql) throws SQLException {
- CallableStatement statement=conn.prepareCall(sql);
- putStatement(conn,statement);
- return statement;
- }
-
- public static PreparedStatement prepareStatement(Connection conn, String sql) throws SQLException{
- PreparedStatement statement= conn.prepareStatement(sql);
- putStatement(conn,statement);
- return statement;
- }
-
- }
<script>render_code();</script>
在dao内的getConnection时 可以这么写
代码
- protected final Connection getConnection(){
- Connection conn=DataSourceUtils.getConnection(getDataSource());
- ConnectionUtils.initStatementMap(conn);
- return conn;
- }
<script>render_code();</script>
关闭Connection时 可以这么写
代码
- protected final void closeConnection(Connection conn) {
- ConnectionUtils.closeAllStatement(conn);
- DataSourceUtils.releaseConnection(conn, getDataSource());
- }
<script>render_code();</script>
要创建Statement时可以这么写
代码
- pstmt = ConnectionUtils.prepareStatement(conn,bufSql.toString());
<script>render_code();</script>
以上只是我的一些思路,虽然在本机测试是可以的,但是不知道到底实际上是否可行
还请看看 谢谢了
|
相关推荐
NULL 博文链接:https://rickgong.iteye.com/blog/2354177
java数据库连接Statement
Java Web 连接数据库技术是指在 Java Web 应用程序中,使用 Java 语言连接和操作数据库的技术,该技术广泛应用于各种基于 Web 的应用程序。 知识点: 1. Java Web 连接数据库的概念和应用 2. 使用 Java 语言连接 ...
java数据库连接PrepareStatement
在模式中创建数据库对象或访问模式中的对象时,可在对象名前指定模式名。 • 支持数据备份和恢复 神通数据库的备份/恢复工具具有图形化的操作界面。用户利用备份工具可以对整个数据库、指定数据 库、或者指定库中的...
2、编写程序实现显示功能选项,创建GUI界面,显示所有学生信息,实现学生添加界面 3、编写程序,实现数据查询功能,加载数据功能,读取数组内容,生成对象,GUI界面显示 4、编写程序实现添加学生功能,创建界面,提示...
如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。 6、在成批处理重复的插入或更新操作中使用...
在创建了数据库连接后,我们可以使用 `Statement` 对象来执行 SQL 语句。例如,我们可以使用 `executeQuery()` 方法来执行查询语句。 4. 处理查询结果 在执行了 SQL 语句后,我们可以使用 `ResultSet` 对象来处理...
首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement() 方法创建,而 PreparedStatement 需要通过 Connection 对象的 prepareStatement() 方法创建,并且需要带有 SQL 语句。...
15. 本例中使用String对象来存储备份文件的路径和名称,使用File对象可以创建备份文件。 16. 使用BufferedWriter对象可以写入备份文件,使用flush()方法可以刷新缓冲区。 17. 使用close()方法可以关闭备份文件,...
JDBC连接所有数据库步骤 1 将数据库的JDBC驱动加载到classpath中,在基于JAVAEE的WEB应用实际开发过程中,通常要把目标数据库产品的JDBC驱动复制到WEB-INF/lib下. 2 加载JDBC驱动,并将其注册到DriverManager中。 3...
在连接 Oracle 数据库时,需要使用 Oracle 的 JDBC 驱动程序。JDBC 驱动程序是 Java 语言中访问数据库的标准 API。使用 Oracle 的 thin 模式连接数据库,需要将 JDBC 驱动程序放到服务器的类路径里。然后,在数据库...
在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。 通过使用java.sql.preparedstatement,这个问题可以自动解决。一个...
JavaBean连接数据库实际上就是定义与数据库连接 类的属性主要有连接数据库的对象、记录集对象、St t对象等;其构造方法实现对数据库的连接,即给连接 ...关闭连接对象、Statement对象、记录集等对象的功能
首先我们设计Connection接口的代理类_Connection,这个代理类接管了Connection接口中所有可能获取到Statement或者PreparedStatement接口实例的方法,例如:prepareStatement和createStatement。改变这两个方法使之...
加载JDBC驱动程序,提供JDBC连接的URL ,创建数据库的连接,创建一个Statement ,执行SQL语句 ,处理结果,关闭JDBC对象
需要注意的是,在封装数据库操作时,不能简单地返回结果集(ResultSet 对象),因为结果集总是依赖于它使用的连接(Connection)对象。因此,当连接对象在方法内被关闭后,返回的 ResultSet 就没有用了。如果真的要...
该方法将建立与数据库的连接。 在使用上面的方法之前,需要先在DriverManager类中注册JDBC数据库驱动程序,一般使用的方法为Class.forname(“Driver name”)。在注册之前,需要先把数据库驱动程序的路径添加到...
预编译语句在执行之前已经被数据库编译器编译过,生成了执行代码,而Statement对象则需要在每次执行时重新编译。这种差异导致PreparedStatement对象执行速度更快,特别是在执行多次相同的SQL语句时。 其次,...
5. 关闭有关连接对象:在使用完毕数据库连接后,需要关闭连接对象,以释放系统资源。 三、实现个人信息的增删改查模块 在实验中,我们实现了个人信息的增删改查模块。首先,我们创建了一个名为 student 的表,该表...