2012-03-07 18 views
1

私は今、私はさらに数(*)を実行せずに最初のクエリの合計行を取り出すことができるように、結果的に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() 

を2次のクエリを実行しようとしている春の3にMyBatisのを使用しています。

しかし、2つ目は常に1を返します。そのため、ログを開いてSqlSessionDaoSupportクラスが最初のクエリの接続を開き、それを閉じて(愚かに)、2番目の接続を新規に開きます。

どうすればこの問題を解決できますか?

答えて

1

私はMyBatisでの経験がないので、私の答えが100%正確であるとは確信していませんが、あなたの問題はこのフレームワークには正確に関係していないようです。

一般に、トランザクションの境界を何とか指定しないと、spring ORMまたはJDBC APIへの各呼び出しは、dataSource/connectionPoolからこの呼び出しのために取得された接続で実行されます。

トランザクションを使用して、同じ接続を維持するか、手動で接続を管理することができます。私は前者をお勧めします。これは、spring db apisが使用される方法です。

+0

に役立ちます願っています。 SqlSessionDaoSupportは、SqlSessionTemplate.SqlSessionInterceptorとSqlSessionUtilsを介してMyBatisが既存のSpringトランザクションに確実に参加するようにします。トランザクションがない場合、各DAOコールは毎回接続を開閉する新しいDAOコールを開始します。 – AngerClown

+0

ありがとうございます。私はトランザクションを定義する方法を見つけるつもりです。 –

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(); 
関連する問題