为什么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的。

+0

正确的。 SqlSessionDaoSupport通过SqlSessionTemplate.SqlSessionInterceptor和SqlSessionUtils确保MyBatis参与任何现有的Spring事务。如果没有交易,则每次DAO呼叫都会启动一个新的呼叫,每次打开和关闭连接。 – AngerClown 2012-03-07 14:55:25

+0

谢谢。我将找出如何定义交易。 – 2012-03-08 00:11:34

希望这有助于

@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();