Mybatis-逻辑连接未关闭

首先环境我用的Struts2 + Sprig + Mybatis

最近重构了Mqsql连接池, 改用了阿里的druid. 因为druid带有WebUi, 我发现我的项目只打开数据库连接却不关闭, 那肯定是sqlSessionfactory出问题了.

因为之前的代码不是我写的, 尝试着关闭sqlSession后还是不管用, 干脆直接使用sqlSessionTemplate.
先配置Spring

1
2
3
4
5
6
7
8
9
10
11
12
13
<span style="white-space:pre">	</span><!--创建sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>

<!-- sqlSessionTemplate配置(支持批量) -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 参数1: sqlSessionFactory|参数2:ExecutorType -->
<constructor-arg index="0" ref="sqlSessionFactory" />
<!-- 开启BATCH批量更新会丢失更新的返回值,导致返回-2147482646 -->
<!-- <constructor-arg index="1" value="BATCH" /> -->
</bean>

项目中伪码如下:

1
2
3
4
5
6
//注入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配置里有个参数被我注释了

1
<constructor-arg index="1" value="BATCH" />

它的意思就是defaultExecutorType=BATCH, defaultExecutorType有三个值:

1
2
3
simple -> 普通返回
reuse -> 重复返回
batch -> 批量更新

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

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2017-2023 王丹鹏
  • Powered by Hexo Theme Ayer
  • 冀ICP备15029707号

请我喝杯咖啡吧~

支付宝
微信