2015-03-31 83 views
8

我有一個web應用程序,我一直在使用Spring Data從iBATIS 2慢慢遷移到JPA。爲什麼iBATIS即使禁用了緩存,也會給出陳舊的結果?

大多數情況下,事情進展順利,我一次只爲一個域對象遷移DAO。然而,最近引起我注意的一個問題是,網站的某些部分顯示陳舊的結果列表。

例如,我有一個「票證」部分,其中顯示了打開票證的列表,並允許您在單獨的頁面上查看特定票證。當我創建新票時,我可以正確查看該票在其特定頁面上。然而,直到稍後的一段時間,公開票單才似乎沒有顯示這張新票。

事情我已經試着排除:

  • 我看到這個問題甚至在系統禁用
  • 我看到,甚至當我在iBATIS的配置設置cacheModelsEnabled="false"這個問題MySQL的查詢緩存。
  • 即使我從我的sqlMap文件中完全刪除<cacheModel>元素和cacheModel="x"屬性,我仍然看到此問題。
  • 只要我重新啓動應用程序,我就會看到最新的結果。
  • 當我執行查詢時,iBATIS應該在MySQL客戶端運行,I do查看iBATIS結果中缺少的新票。
  • 當我使用Spring MVC和Spring Data JPA嘲笑一個簡單的票單時,我do看到新票。

我也試圖排除某種奇怪的交易狀態與iBATIS,但似乎並沒有任何交易在這裏被使用。

我錯過了什麼?還有什麼我應該試圖弄清楚這一點?或者,我應該優先使用Spring Data JPA來完全替換iBATIS層,而這似乎不受此問題的困擾?

UPDATE

現在我已經經歷了很多我最近改變了與git bisect,我已經將範圍縮小到介紹Spring的org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter的變化。

所以,看起來有些交易比它應該活的更長。我會添加更多日誌記錄以查看是否可以確認,然後查找避免使用該過濾器的方法。

+0

你好Pioto,看看這有助於https://groups.google.com/forum/#!searchin/mybatis-user/stale$20results|sort:relevance/mybatis-user/vhYQ6_QaMsI/ETGW-8cZStsJ – 2015-04-10 06:49:00

+0

該鏈接似乎被打破,至少對我而言。您是否願意在回答中至少解釋您在那裏找到的內容? – pioto 2015-04-10 14:37:54

回答

0

所以,似乎一個事物的組合結束了在這裏發生:

  1. 我的大部分代碼沒有明確使用事務。
  2. 我在某些時候更改爲使用Tomcat's JDBC Connection Pool,默認情況下,連接返回到池時不會重置autocommit。不過,我期望我的舊版DBCP系統能夠隱含這樣做。
  3. OpenEntityManagerInViewFilter的引入可能導致某個點調用了SET autocommit=0,如果沒有更改,則後面沒有相應的SET autocommit=1
  4. 偶然或者可能是某種設計,將新記錄插入數據庫然後立即檢索並顯示出來的代碼似乎與顯示我的記錄列表的代碼相比,得到了不同的Connection
  5. 默認的MySQL事務隔離級別REPEATABLE-READ意味着我的列表顯示了舊的結果。

的修復,我發現,這似乎是在我的測試工作,到目前爲止,是這些defaultAutoCommitjdbcInterceptors屬性添加到我的連接池的配置:

<Resource name="jdbc/DB" auth="Container" type="javax.sql.DataSource" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
    ... 
    defaultAutoCommit="true" jdbcInterceptors="ConnectionState;StatementFinalizer" /> 
0

如果您在選擇,插入,選擇相同的SqlSession, 然後SqlSession緩存導致此問題。在insert:sqlSession.clearCache()後,您將需要手動清除緩存 。

+0

我在我的類路徑中沒有看到任何SqlSession ...沒有顯式的會話或事務發生在這裏,我們只有一個對象在單個SqlMapClient對象上運行,調用insert()等......但是,它可能有可能我最近改變了一些東西,以至於SqlMapClient可能比以前更久了(把我的Dao對象從一個方法本地的對象移動到我的控制器的私有類字段)... – pioto 2015-04-10 14:51:18

+0

所以你正在閱讀來自文件的配置信息和創建SQLMap對象以供您的應用程序使用,是否正確理解? – 2015-04-10 15:02:54

+0

正確;我們做'SqlMapClientBuilder.buildSqlMapClient(reader);',或者等價的使用Spring bean,' ...' – pioto 2015-04-10 16:42:11

相關問題