- 浏览: 2610240 次
- 性别:
- 来自: 小胖儿的大城
文章分类
最新评论
-
ni4wangba0:
ni4wangba0 写道亲测,算法有问题。对不起,其实是我自 ...
谈谈"求线段交点"的几种算法(js实现,完整版) -
ni4wangba0:
亲测,算法有问题。
谈谈"求线段交点"的几种算法(js实现,完整版) -
kers007:
苹果不让Webapp 在appstore 里发布,我不知道对 ...
苹果真的要在 AppStore 里封杀 WebApp 吗? -
striveandlive:
fins = js大牛
[原创]GT-Template, 一个超轻量级的js模板工具. -
AlwaysYang:
基础扎实的才能行走天下。
关于body的"大小"在ie和ff下的一些基础知识
前提条件:
1 使用连接池
2 使用了spring的ioc,即DAO是单例的
提出这个问题是由于我们系统中的实际出现的状况
由于开发人员众多,素质参差不齐,开发时间紧迫,
出现了大量的不符合规范的代码以及错误代码.
常见的就是 在关闭链接的时候没有关闭链接的创建的所有的Statement
(关闭了部分,但不是所有)
所以想和 大家探讨一下该如何在代码层次实现关闭数据库链接时,自动关闭由该链接创建的所有的Statement.
我的思路是这样的
将"当前线程+当前链接"创建的所有Statement 放入一个ThreadLocal 对象内.
当关闭链接时, 从ThreadLocal 对象取出 所有的 Statement ,逐个关闭.
不知道这样的思路是否可行.
下面附上代码:
为了阅读方便没有写出全部的创建Statement的方法
在dao内的getConnection时 可以这么写
关闭Connection时 可以这么写
要创建Statement时可以这么写
以上只是我的一些思路,虽然在本机测试是可以的,但是不知道到底实际上是否可行
还请看看 谢谢了
楼上才是正解,原有代码不做任何修改;
出现这种问题,spring完全没有用好。
所以我真正想问的是
" 使用 ThreadLocal对象记录 当前conn在当前线程内打开的所有的Statement.
这样的思路可以不 "??
我觉得这样没有什么问题。
但我不觉得应该用ThreadLocal来记录,一个Connection应该只给一个线程使用(在连接池情况下,也是被close()之后才可以分配给其他线程的。),所以用一般的容器类存放所有此连接上打开的Statement就可以了,在connection.close()时,调用容器中所有的Statement.close(),并清空容器。
可能是我没说明白
我知道这种方式可以 也知道是最好的实现方式
但我的核心问题就是
"在prepareStatement,createStatement等方法上做一些处理,将Statement对象记录下来"
那么怎么记录? 你不能记录当前链接打开的所有的的Statement,因为这样是不安全的吧 因为使用了池,会出现关闭不想关闭的Statement的情况.
所以我真正想问的是
" 使用 ThreadLocal对象记录 当前conn在当前线程内打开的所有的Statement.
这样的思路可以不 "??
而不是该使用什么样的模式来实现这个功能
自己实现一下 java.sql.Connection等接口,把原来的connection包装一下就可以了阿.
以楼主项目的情况来看,有那么多的dao类要进行最小范围的重构,这样的办法应该是不错的。
另外楼主的方法应该也可行,只是增加了些代码量
自己实现一下 java.sql.Connection等接口,把原来的connection包装一下就可以了阿.
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; } }
在dao内的getConnection时 可以这么写
protected final Connection getConnection(){ Connection conn=DataSourceUtils.getConnection(getDataSource()); ConnectionUtils.initStatementMap(conn); return conn; }
关闭Connection时 可以这么写
protected final void closeConnection(Connection conn) { ConnectionUtils.closeAllStatement(conn); DataSourceUtils.releaseConnection(conn, getDataSource()); }
要创建Statement时可以这么写
pstmt = ConnectionUtils.prepareStatement(conn,bufSql.toString());
以上只是我的一些思路,虽然在本机测试是可以的,但是不知道到底实际上是否可行
还请看看 谢谢了
评论
15 楼
poiuyt373
2007-07-12
楼上才是正解,原有代码不做任何修改;
出现这种问题,spring完全没有用好。
14 楼
leadyu
2007-07-12
建议不要这样,这样的话维护较为困难,我的方法是代理连接池,spring也可采用第三方数据源,写个connection代理,new YouCnnection(Connection delegate).这样对于系统是透明的,默默地把资源回收了
代理里面想解决关闭statement的事,不用说大家也知道怎么做了吧。
代理里面想解决关闭statement的事,不用说大家也知道怎么做了吧。
13 楼
huangpengxiao
2007-04-26
在连接池情况下,也是被close()之后才可以分配给其他线程的
确定?
确定?
12 楼
fins
2007-04-22
谢谢 你解开了我一大疑问啊
我对池的一些知识确实很匮乏 谢谢指点
"在连接池情况下,也是被close()之后才可以分配给其他线程的"
这句话正是我想知道的 谢谢
我对池的一些知识确实很匮乏 谢谢指点
"在连接池情况下,也是被close()之后才可以分配给其他线程的"
这句话正是我想知道的 谢谢
11 楼
LucasLee
2007-04-21
fins 写道
所以我真正想问的是
" 使用 ThreadLocal对象记录 当前conn在当前线程内打开的所有的Statement.
这样的思路可以不 "??
我觉得这样没有什么问题。
但我不觉得应该用ThreadLocal来记录,一个Connection应该只给一个线程使用(在连接池情况下,也是被close()之后才可以分配给其他线程的。),所以用一般的容器类存放所有此连接上打开的Statement就可以了,在connection.close()时,调用容器中所有的Statement.close(),并清空容器。
10 楼
fins
2007-04-21
Lucas Lee 写道
既然这样的话,我也觉得包装Connection,然后delegate到实际的Connection上,除了在prepareStatement,createStatement等方法上做一些处理,将Statement对象记录下来;等Connection.close()时,调用所有Statement.close()。
可能是我没说明白
我知道这种方式可以 也知道是最好的实现方式
但我的核心问题就是
"在prepareStatement,createStatement等方法上做一些处理,将Statement对象记录下来"
那么怎么记录? 你不能记录当前链接打开的所有的的Statement,因为这样是不安全的吧 因为使用了池,会出现关闭不想关闭的Statement的情况.
所以我真正想问的是
" 使用 ThreadLocal对象记录 当前conn在当前线程内打开的所有的Statement.
这样的思路可以不 "??
而不是该使用什么样的模式来实现这个功能
9 楼
likeblood
2007-04-20
6楼正解
8 楼
LucasLee
2007-04-20
既然这样的话,我也觉得包装Connection,然后delegate到实际的Connection上,除了在prepareStatement,createStatement等方法上做一些处理,将Statement对象记录下来;等Connection.close()时,调用所有Statement.close()。
7 楼
spiritfrog
2007-04-20
codeutil 写道
自己实现一下 java.sql.Connection等接口,把原来的connection包装一下就可以了阿.
以楼主项目的情况来看,有那么多的dao类要进行最小范围的重构,这样的办法应该是不错的。
另外楼主的方法应该也可行,只是增加了些代码量
6 楼
hpq852
2007-04-19
装饰模式的经典场景.
另外好的连接池在回收Connection的时候会自动关闭ResultSet 和 Statement 的
另外好的连接池在回收Connection的时候会自动关闭ResultSet 和 Statement 的
5 楼
codeutil
2007-04-19
自己实现一下 java.sql.Connection等接口,把原来的connection包装一下就可以了阿.
4 楼
fins
2007-04-19
其实这些我知道
但是现在的前提是 系统已经开发完成
一共有2000多个dao 都使用了传统的方式
在进行最小的重构前提下,我在顶楼里提出的那种思路和方案是否可行呢
但是现在的前提是 系统已经开发完成
一共有2000多个dao 都使用了传统的方式
在进行最小的重构前提下,我在顶楼里提出的那种思路和方案是否可行呢
3 楼
realreal2000
2007-04-19
使用jdbcTemplete是不错的办法,推广它的时间和培训时间应该不是难么难吧
2 楼
fins
2007-04-19
楼上的有些高估我们的开发所采用的技术了
我们dao里就是要操作那些基本的 connection statement resultset
在这个前提下有什么办法呢 我也很无奈
如果想从源头解决问题 那就是所有开发人员提高个人职业修养和素质
否则什么都没用
我们dao里就是要操作那些基本的 connection statement resultset
在这个前提下有什么办法呢 我也很无奈
如果想从源头解决问题 那就是所有开发人员提高个人职业修养和素质
否则什么都没用
1 楼
LucasLee
2007-04-19
这种方法不在源头解决,我看以后维护可能比较麻烦。
源头上统一使用一些jdbcTemplete方法避免直接管理connection和statement不就可以了?
源头上统一使用一些jdbcTemplete方法避免直接管理connection和statement不就可以了?
发表评论
-
一个商业公司如果要支持一个开源项目的话,它需要做哪些工作啊?
2009-12-07 16:55 4953一个商业公司如果要支持一个开源项目的话,它需要做哪些工作呢? ... -
如何让jxl (jexcelapi) 支持更多的数据
2009-01-08 23:52 4517jxl (jexcelapi) 一直是我比较喜欢的 java版 ... -
在java中"模拟" XMLHttpRequest
2008-11-03 12:17 13095这里所说的"模拟" 是指 : 在java中 ... -
利用google docs进行"轻量级过程管理".
2008-08-28 13:21 0利用google docs进行" ... -
[请教]jxl生成xls时,支持"合并"或"磁盘缓存"吗(导出大数据量时)
2008-07-28 09:37 6940jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-ex ... -
不错的国产开源免费的php框架: FleaPHP
2008-07-28 01:58 8518之前用他开发过一个小的网站 开发过程非常轻松愉快 体验也很好 ... -
GT-FrontController, 一个简陋的MVC控制器的设计思路
2008-07-06 23:53 2730在给GT-Grid做前后台结合的例子时, 为了"快速 ... -
h2database 普及系列一: 简介
2008-05-06 19:10 22118这不是一个新东西,但是 ... -
JSF 与 "我的伟大发明" ---- 关于B/S UI开发的胡言乱语
2008-04-10 14:25 14467这篇帖子后面的回复和 ... -
初看JSF后的胡言乱语
2008-04-10 09:31 4583最近看了一点jsf ---- 只 ... -
Help,如何在J2EE环境下使用Sqlite以及如何将sqlite打入war包
2008-03-27 09:46 3785需求是这样的 希望j2ee应用(基于应用 而不是整个服务器) ... -
请记住: i AM SoLiD. (关于View的事件触发顺序)
2007-11-16 04:11 2627View 提供了若干事件. 在渲染 布局 展现 相关事件的触 ... -
Android SDK下, 如何在程序中输出日志 以及如何查看日志.
2007-11-15 22:38 9846Android SDK下, 如何在程序中输出日志 以及如何查看 ... -
小胖加入Android Fans的 大军了 呵呵
2007-11-15 13:30 3136决定开始研究 Android 了. 以前研究过 j2me 对 ... -
老帖: findbugs简介
2007-11-02 10:09 3567这个时候说 findbugs ??? ... -
世上没有B/S系统,只有B系统和S系统.
2007-09-12 13:45 34346先说些与标题貌似无关的话. 随着prototype DWR ... -
[求助]有没有哪个缓存组件支持 基于访问频率的清理策略
2007-08-29 18:30 2404目前缓存清理策略几乎都是基于 存活期 和 活跃期 还有缓存队列 ... -
[发布2007-08-06]Ajax向导组件 WebWizard Component Beta1
2007-08-06 15:55 4995/****************************** ... -
寻求一个eclipse下更好的snippet插件(或代码模板管理插件 或代码生成器)
2007-07-26 11:12 4258eclipse自带一个snippet插件,但是功能有限. 只支 ... -
让Struts 1焕发青春----小议对Struts的改造.
2007-06-25 15:27 7597目前流行的新型的MVC框架 几乎都在"增强单元测试能 ...
相关推荐
// 结果集、Statement和Connection将在try块结束时自动关闭 } catch (SQLException e) { e.printStackTrace(); } ``` 在上述代码中,即使在处理结果集或执行SQL时出现异常,try-with-resources语句也会确保所有...
在IT行业中,数据库链接模板是实现Java应用程序与数据库交互的一种常用方法。这个主题涉及到Java的JDBC(Java Database Connectivity)API,它允许开发者编写能够连接、查询和操作各种数据库的代码。下面将详细阐述...
本实例主要关注如何使用JDBC进行数据库链接操作,我们将深入探讨JDBC的核心概念、数据库连接步骤以及在实际应用中的注意事项。 首先,JDBC提供了四个核心接口,它们分别是DriverManager、Connection、Statement和...
例如,使用`connection.setAutoCommit(false)`关闭自动提交,然后在所有操作成功后调用`connection.commit()`提交事务,否则调用`connection.rollback()`回滚。 9. **安全性**:确保对用户输入进行验证和清理,避免...
在创建数据库链接时,我们需要遵循一些步骤和技巧。 首先,创建数据库链接需要有`CREATE DATABASE LINK`系统权限。例如,若要在本地数据库(如SCOTT账户)上创建到远程数据库(服务名为MYDB_REMOTE)的链接,可以...
- 创建Statement或PreparedStatement对象来执行SQL语句。 - Statement用于简单、静态的SQL语句,而PreparedStatement支持预编译的SQL,可以防止SQL注入,适用于动态SQL。 - 使用Statement或PreparedStatement的...
此外,为了提高代码的可读性和可维护性,可以考虑使用try-with-resources语句,它能自动关闭实现了AutoCloseable接口的资源,如: ```java try (Connection conn = getConnection(); PreparedStatement pstmt = ...
3. 创建Statement或PreparedStatement对象:Statement用于执行静态SQL语句,PreparedStatement用于预编译SQL语句,提高执行效率并防止SQL注入。 4. 执行SQL:调用Statement或PreparedStatement的executeQuery()或...
3. **创建Statement**:`Connection`对象可以用来创建`Statement`或`PreparedStatement`,用于执行SQL语句。 4. **执行SQL**:使用`executeQuery()`或`executeUpdate()`方法执行查询或更新操作。 5. **处理结果**...
4. **创建Statement或PreparedStatement**: - `Statement`用于执行静态SQL语句,适合简单的查询。例如:`Statement stmt = conn.createStatement();` - `PreparedStatement`预编译SQL语句,支持参数化,提高性能...
通过调用`Connection`对象的`setAutoCommit(false)`来禁用自动提交,然后在所有操作完成后调用`commit()`,或者在出现错误时调用`rollback()`。 **异常处理** 在JDBC编程中,必须捕获并处理可能抛出的异常,如`...
记得在完成所有操作后关闭Statement、ResultSet和Connection,以释放资源。 5. **异常处理**: 在进行数据库操作时,需要捕获并处理可能抛出的SQLException,确保程序的健壮性。 6. **事务管理**: JDBC支持事务...
本示例将帮助初学者理解如何在Java中建立和管理数据库链接。 首先,我们需要引入JDBC(Java Database Connectivity)API,这是Java标准版的一部分,提供了与各种数据库系统交互的接口和类。在Java项目中,通常通过...
- 创建Statement对象:根据需求选择Statement、PreparedStatement或CallableStatement,用于执行SQL语句。 - 执行SQL:调用Statement对象的`executeQuery()`或`executeUpdate()`方法执行SQL。 - 处理结果:如果...
连接池预先创建并维护一定数量的数据库连接,避免了频繁地打开和关闭连接。 9. **异常处理**:在处理数据库操作时,需要捕获并适当地处理 `SQLException` 及其子类,确保程序的健壮性。 10. **兼容性**:ojdbc7....
在IT行业中,数据库链接是应用程序与数据库交互的关键环节。在这个场景中,我们关注的是"链接数据库",这通常涉及到编程语言中的数据访问技术,特别是标签中提到的"Java"。Java提供了一种强大的机制来连接并操作...
3. 连接步骤:(i) 加载驱动,(ii) 建立连接,(iii) 创建Statement或PreparedStatement对象,(iv) 执行SQL,(v) 处理结果,(vi) 关闭资源。 二、学生信息管理 1. 表设计:学生信息管理可能涉及一个名为“student”的...
如果你的操作涉及多个数据库更改,可以使用`Connection`对象的`setAutoCommit(false)`方法关闭自动提交,然后在完成所有更改后调用`commit()`。如果发生错误,调用`rollback()`回滚事务。 6. 关闭连接: 记得在...
在"java所有驱动与数据库代码.rar"这个压缩包中,可能包含了各种数据库的JDBC驱动jar包,例如MySQL的`mysql-connector-java.jar`,Oracle的`ojdbc.jar`等。这些驱动包是Java程序连接对应数据库所必需的,需将其添加...
- 创建Statement/PreparedStatement对象:用于执行SQL语句。 - 执行SQL:调用Statement/PreparedStatement的`executeQuery()`或`executeUpdate()`方法。 - 处理结果:对于查询结果,可以使用ResultSet对象进行...