mybatis逻辑连接未关闭

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

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

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

先配置spring

<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>


伪代码如下

//注入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配置里有一个参数被我注释掉了

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

它的意思就是defaultExecutorType=BATCH

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

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




MyBatis实现逻辑过程主要包括以下几个步骤: 1. 配置:首先,需要配置MyBatis的环境和数据源。这可以通过XML配置文件或Java注解来完成。配置文件中包括数据库连接信息、映射文件路径、类型别名等。 2. 创建SqlSessionFactory:通过配置文件或者Java代码创建SqlSessionFactory对象,SqlSessionFactory是MyBatis的核心对象,用于创建SqlSession。 3. 创建SqlSession:通过SqlSessionFactory.openSession()方法来创建SqlSession对象,SqlSession是与数据库交互的会话对象,可以执行SQL语句、提交事务等操作。 4. 定义映射文件或注解:定义SQL语句和结果映射规则。映射文件可以使用XML配置方式或注解方式来定义SQL语句和结果映射规则。 - XML配置方式:在XML配置文件中定义SQL语句和结果映射规则。例如: ```xml <select id="getUserById" parameterType="int" resultType="com.example.User"> SELECT * FROM users WHERE id = #{id} </select> ``` - 注解方式:在DAO接口的方法上使用注解定义SQL语句和结果映射规则。例如: ```java @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(@Param("id") int id); ``` 5. 执行SQL语句:通过SqlSession的方法执行SQL语句。例如,使用selectOne()方法执行查询操作,使用insert()、update()、delete()方法执行增删改操作。 6. 处理结果:根据SQL语句的不同,可以通过调用SqlSession的方法来获取查询结果。例如,使用selectOne()方法获取单个结果对象,使用selectList()方法获取结果集列表。 7. 提交事务和关闭资源:在需要提交事务时,调用SqlSession的commit()方法进行事务提交。最后,调用SqlSession的close()方法关闭会话,释放资源。 以上是MyBatis实现逻辑的基本过程。通过配置环境、创建SqlSessionFactory、创建SqlSession、定义映射文件或注解、执行SQL语句等步骤,可以实现与数据库的交互操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值