2010-12-15 95 views
1

我在春季使用ibatis寫入mysql。spring ibatis mysql間歇性異步問題

我有一個間歇性的錯誤。在一個進程的每個循環中,我向db寫入兩行。下一個週期我讀取上一個週期的行。有時候(30次中的一次,有時更頻繁,有時更少),我只從db獲取一行。

我關閉了所有我能想到的緩存。我的SqlMap-config.xml中只是說:

<sqlMapConfig> 
<settings enhancementEnabled="false" statementCachingEnabled="false" classInfoCacheEnabled="false"/> 

<sqlMap resource="ibatis/model/cognitura_core.xml"/> 

有一些不同步,或者緩存到Spring或iBatis的或者說我失蹤了MySQL驅動程序?

使用Spring 3.0.5,2.3.5的MyBatis,使用mysql-connector-java的5.0.5

編輯1:

難道是因爲我使用的連接(C3P0)的池?閱讀時插入是否仍在運行?這很奇怪,但是,我認爲一切都會同步發生,除非我明確宣佈異步?

回答

0

你在插入後調用SqlSession.commit()嗎? C3P0異步「關閉」連接,可能會在封面下調用提交。這可以解釋你所看到的行爲。

+0

感謝您的建議。這聽起來很有希望..我不確定你的意思是SqlSession.commit()。我調用插入像getSqlMapClientTemplate()。insert(「insertIterationHistory」,dataMap); - 該模板似乎沒有提交方法。我應該只用@Transaction註釋該方法嗎?我想我真的不明白提交應該發生在哪裏。我認爲每個插入將默認自動提交.. – bruce 2010-12-16 03:47:29

+0

嗯..我剛剛閱讀http://old.nabble.com/how-to-dusable-asynch-threads---td21196742.html增加你的異步解釋的權重。我想我只是要使用不同的連接池來同步執行任何操作。 – bruce 2010-12-16 03:56:06

+0

對不起,誤解爲MyBatis 3.原理相同。您需要一個事務來獲取數據庫提交,因此添加註釋應該可行,假設您已經配置了DataSourceTransactionManager並且在您的Spring配置中具有類似於的東西。 – AngerClown 2010-12-16 12:49:41

0

我得到了類似的行爲。這就是我正在做的。我有一個老版本的IBATIS,我不打算升級。你可以很容易地將其移入裝飾器。

SqlMapSession session = client.openSession(); 
try { 
    try { 
     session.startTransaction(); 
     // do work 
     session.commitTransaction(); 
     // The transaction should be committed now, but it doesn't always happen. 
     session.getCurrentConnection().commit(); // Commit again :/ 
    } finally { 
     session.endTransaction(); 
    } 
} finally { 
    session.close(); // would be nice if it was 'AutoCloseable' 
}