Java 为什么MyBatis在执行每个语句后关闭会话?
我在春天三号用MyBatis。现在我尝试执行以下两个查询Java 为什么MyBatis在执行每个语句后关闭会话?,java,spring,jdbc,mybatis,Java,Spring,Jdbc,Mybatis,我在春天三号用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(*) 但
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的经验,但听起来您的问题与此框架并不完全相关 通常,如果不以某种方式指定事务边界,那么对spring ORM或JDBC api的每个调用都将在从dataSource/connectionPool为此调用检索的连接中执行 您可以使用事务来确保保持相同的连接,也可以手动管理连接。我推荐前者,这就是spring db API的使用方式。希望这能有所帮助
@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调用都会启动一个新的事务,每次都会打开和关闭连接。谢谢。我将了解如何定义事务。