2012-03-07 99 views
1

我使用的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類爲第一個查詢打開一個連接,並關閉它(愚蠢),併爲第二個連接打開一個新的連接。

我該如何解決這個問題?

回答

1

我不確定我的答案會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

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(); 
相關問題