mybatis逻辑连接未关闭

首先,我用的框架是Struts2+Spring+Mybatis

最近重构了缓冲池,改用了阿里的druid,因为具有统计功能,我发现我的项目只打开数据库链接却不关闭,那肯定是sqlSessionFactory出问题了。

因为之前的代码不是我写的,尝试着关闭sqlSession后还是不管用,干脆直接使用SqlSessionTemplate。

先配置spring

	
	
		
		
	

	
	
		
		
		
		
	


伪代码如下

//注入spring中配置的SqlSessionTemplate对象,单例
@Resource(name="sqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate;
public void saveTestTrans(){
     this.sqlSessionTemplate.selectList("testdomain.selectAnySql", "select * from my_blog where id='1'");
}


这里的SqlSessionTemplate不仅是单例的,而且不需要手工新建和关闭SqlSession

为什么mybatis-spring.jar中的SqlSessionTemplate可以被多个dao复用,而且不会造成数据连接泄露呢,并且还可以自动新建和释放数据库连接?官方解答是因为SqlSessionTemplate是线程安全的,也就是确保每个线程使用的sqlSession的唯一并不互相冲突。

首先看了一下mybatis-spring的源码,发现SqlSessionTemplate是通过代理拦截和SqlSessionHolder实现的sqlsession线程安全和自动新建和释放连接的。看构造函数函数中构建代理类,该代理类实现SqlSession接口,定义了方法拦截器,如果调用代理类实例中实现SqlSession接口定义的方法,该调用则被导向SqlSessionInterceptor的invoke方法,这个方法中自动进行了SqlSession的自动请求和释放(如果不被spring托管则自己新建和释放sqlsession,如果被spring管理则使用SqlSessionHolder进行request和relase操作)

以下网址针对SqlSessionTemplate的线程安全特性进行了详细的探究:http://www.cnblogs.com/daxin/p/3544188.html


另外,这里还有一个坑

上面spring配置里有一个参数被我注释掉了

它的意思就是defaultExecutorType=BATCH

defaultExecutorType有三个值:SIMPLE 普通返回;REUSE 重复;BATCH 批量更新。

一旦选择了BATCH 属性,那么所有的更新插入操作返回的那个int类型的数值就会是-2147482646,也就是返回值丢失了。




你可能感兴趣的:(mybatis,mybatis)