`
java_tip
  • 浏览: 5837 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

从Session中获取Connection需要注意的

阅读更多
虽然不推荐从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()的方法,具体的源码以后补上,晚了.
分享到:
评论
1 楼 yzjdt 2012-05-10  
的确用close有问题  刚用close没报错 但是居然在获取连接那里卡住了
找了半天 才看到楼主这篇文章 才恍然大悟  感谢楼主分享啊

相关推荐

    微信OAuth2.0网页授权接口

    并且,即使在未关注的情况下,只要用户授权,也能获取其信息),AuthAction.class.php默认为snsapi_base,而且session中只记录了snsapi_base中的基础数据,如需要snsapi_userinfo请自行修改。 具体的实现方法见代码...

    HttpClient以及获取页面内容应用

    压缩包中含有多个文档,从了解httpclient到应用。 httpClient 1httpClint 1.1简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持...

    ssh(structs,spring,hibernate)框架中的上传下载

     特别需要注意的是:数据库表为Blob类型的字段在Tfile中的fileContent类型为byte[]。Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下:  代码 2 领域对象映射文件 1. 2. !DOCTYPE ...

    net学习笔记及其他代码应用

    6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? ...

    Hibernate+中文文档

    21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    hibernate3.2中文文档(chm格式)

    21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...

    citrix 中文管理操作手册

    从文件中导入已发布应用程序设置 58 使虚拟 IP 地址对应用程序可用 59 虚拟 IP 地址工作原理 60 虚拟环回 60 绑定应用程序 60 确定应用程序是否需要使用虚拟 IP 地址 61 使虚拟 IP 地址对会话中运行的应用程序可用 ...

    Hibernate 中文 html 帮助文档

    21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:...

    Hibernate中文详细学习文档

    21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...

    ibatis 开发指南(pdf)

    纵观目前主流的ORM ,无论Hibernate 还是 Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO 到数据库表的全 套映射机制。程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    在应用服务器中使用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. ...

    HibernateAPI中文版.chm

    21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. ...

    linux vsftpd搭建步骤 亲测可用

    一 vsftpd搭建步骤 1、首先安装vsftpd,并设置开机启动 yum -y install vsftpd ...* 认证用户id 认证用户的id,如果使用*,则表示无法获得该id c 完成状态 传输的状态: c 表示传输已完成 i 表示传输示完成

    Spring中文帮助文档

    在应用服务器中使用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 ...

    Visual_C++精彩实例详解

    4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project-&gt;Setting-&gt;General-&gt;Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...

    Visual_C++精彩实例详解.part2.rar

    4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project-&gt;Setting-&gt;General-&gt;Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...

    Visual_C++精彩实例详解.part4.rar

    4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project-&gt;Setting-&gt;General-&gt;Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...

    Visual_C++精彩实例详解.part5.rar

    4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project-&gt;Setting-&gt;General-&gt;Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...

    Visual_C++精彩实例详解.part3.rar

    4. 在VC中若运行工程时提示不能执行exe文件,此时请将VC中菜单Project-&gt;Setting-&gt;General-&gt;Executable for debug Session 重新定位到该工 程的exe可执行文件即可。 附件 CButtonST为一个很有名也非常实用的...

Global site tag (gtag.js) - Google Analytics