Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么MyBatis在执行每个语句后关闭会话?_Java_Spring_Jdbc_Mybatis - Fatal编程技术网

Java 为什么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(*) 但

我在春天三号用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的经验,但听起来您的问题与此框架并不完全相关

通常,如果不以某种方式指定事务边界,那么对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调用都会启动一个新的事务,每次都会打开和关闭连接。谢谢。我将了解如何定义事务。