虽然不推荐从Session中获取connection,但是偶尔会出现一些特殊情况不得以这样做。
接下来的问题就是:使用后的session/connection如何处理?
1.close connection
相信大多数人的第一返回会是这样,关闭连接,这是非常错误的(没来得及看官方文档,自己做了下测试)
引用
配置(连接池中任何情况只一条连接)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="initialSize" value="1" />
<property name="maxActive" value="1" />
<property name="maxIdle" value="1" />
<property name="minIdle" value="1" />
</bean>
/**多线程测试关闭连接*/
public static void closeTest() throws SQLException{
Session session = Test.getSession();
Connection conn = null;
PreparedStatement pst = null;
try{
conn = session.connection();
pst = conn.prepareStatement(sql);
pst.executeQuery();
}catch(Exception e){
e.printStackTrace();
}finally{
conn.close();
pst.close();
}
}
我本来是开的4个线程分别去执行这个方法20次,结果刚到第二次的时候,连接池便抛异常:
Timeout waiting for idle object(获取连接超时)。甚至后来只开一个线程也不行。
这里很奇怪,从连接池中取出来的connection不是已经经过包装了吗?在close()的时候会自动将连接放回连接池!?
我打印conn.getClass() 得到的是一个$Proxy,父类java.lang.reflect.Proxy
而从直接连接池(BasicDataSource)中取出来的是org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
当然,也不能断定从session取出来的connection的close方法没有(试图)放入连接池,
但事实是它的确没有正确归还。
而开四个线程同时跑以下代码没有一点问题,这个实验有点废....
public static void poolTest() throws SQLException{
getConnection().close();
}
(我打算用javasisst把从session中取出来的connection的close方法打印出来,实在找到其它方法如看动态代理的源代码,此处待续...)
2.Session.close();
将上面测试代码换成
public static void closeSessionTest() throws SQLException{
Session session = Test.getSession();
Connection conn = null;
PreparedStatement pst = null;
try{
conn = session.connection();
pst = conn.prepareStatement(sql);
pst.executeQuery();
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
if(pst != null){
pst.close();
}
}
}
ok!运行阶段没有异常。运行数速度也很快.!
分析见下一测试。
3.Session.disconnect();
测试代码
public static void closeSessionTest() throws SQLException{
Session session = Test.getSession();
Connection conn = null;
PreparedStatement pst = null;
try{
conn = session.connection();
pst = conn.prepareStatement(sql);
pst.executeQuery();
}catch(Exception e){
e.printStackTrace();
}finally{
session.disconnect();
if(pst != null){
pst.close();
}
}
}
运行结果正常,速度也正常。
很明显,对于从session中取出connection千万不要close()
进一步看hibernate源码,session.close()与session.disconnect()中都有一个(正常)分支流程是
if ( rootSession == null ) {
return jdbcContext.getConnectionManager().close();
}
而这个方法调用的是一个cleanup()的方法,具体的源码以后补上,晚了.
分享到:
相关推荐
并且,即使在未关注的情况下,只要用户授权,也能获取其信息),AuthAction.class.php默认为snsapi_base,而且session中只记录了snsapi_base中的基础数据,如需要snsapi_userinfo请自行修改。 具体的实现方法见代码...
压缩包中含有多个文档,从了解httpclient到应用。 httpClient 1httpClint 1.1简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持...
特别需要注意的是:数据库表为Blob类型的字段在Tfile中的fileContent类型为byte[]。Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下: 代码 2 领域对象映射文件 1. 2. !DOCTYPE ...
6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? ...
21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...
查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...
21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...
从文件中导入已发布应用程序设置 58 使虚拟 IP 地址对应用程序可用 59 虚拟 IP 地址工作原理 60 虚拟环回 60 绑定应用程序 60 确定应用程序是否需要使用虚拟 IP 地址 61 使虚拟 IP 地址对会话中运行的应用程序可用 ...
21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:...
21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...
纵观目前主流的ORM ,无论Hibernate 还是 Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全 套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate ...
在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4. ...
21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...
一 vsftpd搭建步骤 1、首先安装vsftpd,并设置开机启动 yum -y install vsftpd ...* 认证用户id 认证用户的id,如果使用*,则表示无法获得该id c 完成状态 传输的状态: c 表示传输已完成 i 表示传输示完成
在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...
4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project->Setting->General->Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...
4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project->Setting->General->Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...
4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project->Setting->General->Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...
4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project->Setting->General->Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...
4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project->Setting->General->Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...