为什么MyBatis会在执行每个语句后关闭会话?

时间:2012-03-07 09:10:18

标签: java spring jdbc mybatis

我在Spring 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类为第一个查询打开了一个连接,然后关闭它(愚蠢地),并为第二个查询打开一个新连接。 / p>

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我不确定我的答案是否100%准确,因为我没有使用MyBatis,但听起来你的问题与这个框架并不完全相关。

通常,如果不以某种方式指定事务边界,则每次调用spring ORM或JDBC api都将在从dataSource / connectionPool为此调用检索的连接中执行。

您可以使用事务来确保使用相同的连接或手动管理连接。我推荐前者,这就是如何使用spring db apis。

答案 1 :(得分:0)

希望这会有所帮助

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