为什么MyBatis在执行每个语句后关闭会话?
问题描述:
我使用的MyBatis春3.现在我试图执行因此以下两个查询,为什么MyBatis在执行每个语句后关闭会话?
SELECT SQL_CALC_FOUND_ROWS() *
FROM media m, contract_url_${contract_id} c
WHERE m.media_id = c.media_id AND
m.media_id = ${media_id}
LIMIT ${offset}, ${limit}
SELECT FOUND_ROWS()
,这样我可以检索第一个查询的总排不执行COUNT(*)还。
但是,第二个总是返回1,所以我打开日志,发现SqlSessionDaoSupport类为第一个查询打开一个连接,并关闭它(愚蠢),并为第二个连接打开一个新的连接。
我该如何解决这个问题?
答
我不确定我的答案会100%准确,因为我没有MyBatis的使用经验,但听起来好像您的问题与此框架并不完全相关。一般来说,如果你没有以某种方式指定事务边界,那么每次调用弹出ORM或JDBC API将调用从dataSource/connectionPool为此调用获取的连接。
您可以使用事务来确保您保持相同的连接或手动管理连接。我建议前者是如何使用spring db apis的。
答
希望这有助于
@Resource
public void setSqlSessionFactory(DefaultSqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
SqlSession sqlSession = sqlSessionFactory.openSession();
YourMapper ym = sqlSession.getMapper(YourMapper.class);
ym.getSqlCalcFoundRows();
Integer count = pm.getFoundRows();
sqlSession.commit();
sqlSession.close();
正确的。 SqlSessionDaoSupport通过SqlSessionTemplate.SqlSessionInterceptor和SqlSessionUtils确保MyBatis参与任何现有的Spring事务。如果没有交易,则每次DAO呼叫都会启动一个新的呼叫,每次打开和关闭连接。 – AngerClown 2012-03-07 14:55:25
谢谢。我将找出如何定义交易。 – 2012-03-08 00:11:34