2011-11-18 94 views
1

我有一個從共享mysql數據庫讀取的項目。有一個來自會話的大型賬戶對象(太大,但那是另一回事)。陳舊的Hibernate createSQLQuery

問題是此對象的blance字段在同一臺機器上被不同進程記入。所以用戶可以看到20英鎊的餘額,但實際上他們的餘額可能要低得多。應用程序無法知道此值何時更改。

所以我想我會做什麼是檢查MySQL每次我從數據庫中的值問,但它是通過面,所以它問了很多次,所以我把一個檢查,如果它沒有要求幾秒鐘,只在平衡點上做一個createSQLquery,看它是否不同,如果是,重新加載對象。

所以我做了什麼沿着線:

sess.createSQLQuery("SELECT Balance from Account").list(); 

和獲得的價值。有些時候它顯示了正確的平衡,但它通常會顯示以前讀取的平衡,其中mysql命令行客戶端顯示實際值。

有沒有辦法清除這個值,或者更新對象的其他方式?我想最終刪除休眠因爲它會導致我解決更多的問題,但目前,我只需要餘額顯示基於數據庫的值。

回答

1

您可以嘗試在休眠會話中重新加載該對象。 http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html

sess.refresh(yourReadObject); 

也許清除會話

sess.clear(); 

可以很好的幫助。但它可能有更多的副作用。

+0

這就是它應該做的事情,我想是正確的。我在確定對象已更改時執行此操作,但它始終無法完成更改 – Woody

1

由於您無論如何計劃消除休眠,您可以直接使用JDBC連接繞過休眠會話而不影響其他任何事情。

Connection con = getSession().connection(); 
PreparedStatement s = con.prepareStatement("..."); 
s.setString(1, "..."); 
ResultSet rs = s.executeQuery(); 
+0

這是一個好主意,我不知道我可以這樣做(儘管.connection似乎已被廢棄) 。但是,它仍然會提供緩存的結果。我得到了一個原始的JDBC連接並比較了結果(即,只是更改第一行)。它產生了與休眠連接不同的結果! – Woody

+0

看看mysql的查詢日誌。它應該執行每一次。 – cherouvim

+0

它應該是,但我通過直接的JDBC和一個通過休眠獲得了連接,並通過兩者運行相同的查詢,然後進行比較。我在比較中放了一個斷點,它幾次觸發斷點。 – Woody

0

我覺得是肯定的唯一途徑是驅逐所有對象從他的Hibernate Session一旦你得到了他們。

這意味着在執行上面的語句之後,需要分別驅逐每個對象,將對象清除爲對象似乎不起作用。 (以下假定對象名稱)

for(Balance b : listOfBalances) { 
    hibernateSession.evict(b); 
} 

我懷疑這是爲了做到這一點(我不是休眠專家)的最佳方式,但它是我發現的唯一途徑,你可以100%肯定,你會不接收陳舊的物體。 (我知道這個回覆有點晚,但希望它可以幫助某人)