2009-08-13 29 views
3

我有一個由.net客戶端和java web服務組成的小型系統。休眠不注意從其他來源所做的數據庫更新

.NET客戶端將一個對象插入到數據庫中,然後調用Web服務。 Web服務嘗試使用hibernate檢索此對象。第一次它工作正常,但是每隔一段時間它就說沒有給定標識符的對象。

我已經手動檢查了數據庫,行確實存在! (我調試了Web服務,甚至在會話打開之前檢查了該行)。

SOLUTION

將此添加到休眠配置文件

<property name="connection.isolation">1</property> 

這裏是我試過到目前爲止:

  1. 二級緩存被禁用
  2. 添加.setCacheMode(CacheMode.REFRESH)

這裏的失敗代碼:

Session session = Program.HibernateUtil.getSessionFactory().openSession();  
try  
{ 
    return (Alert)session.load(Alert.class, id);       
} ... 
+0

你可以打開Hibernate中的日誌記錄來查看當你調用加載時它究竟在做什麼以及它正在生成的SQL查詢嗎? – 2009-08-13 13:12:12

+0

將日誌打印到stdout,並且生成的sql與預期一致。我甚至嘗試將其複製到一個MySQL客戶端來檢查它。問題是它說沒有給定標識符的元素。即使它是:-)所以我的猜測是,它實際上並沒有檢查數據庫,而是一些其他類型的緩存。 – l3dx 2009-08-13 13:14:34

+0

非常感謝!我花了大約2天找到了這個問題的答案。謝謝。 – Ittai 2010-01-13 18:16:53

回答

2

它看起來像二級緩存(與會話工廠關聯的一個)應該被禁用,所以我建議的唯一的其他事情是明確地清除緩存與呼叫:

sessionFactory.evict(Alert.class) 

注意:閱讀評論的完整答案。

+0

謝謝。我試過了,但沒有任何區別。 – l3dx 2009-08-13 13:56:59

+0

現在很奇怪。您的連接如何管理?如果連接真的無法看到其他進程所做的更新,會不會出現一些奇怪的隔離級別/事務問題? – 2009-08-13 14:01:36

+0

我不確定您是否通過連接表示會話?如果是這樣,我使用Hibernate教程中提供的HibernateUtil幫助器類http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial.html#tutorial-firstapp-helpers – l3dx 2009-08-14 06:14:49

0

嘗試設置此休眠特性:

在hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider

+0

嗨。我已經在我的配置中有這個。 ! - 禁用二級緩存 - > org.hibernate.cache.NoCacheProvider l3dx 2009-08-13 13:11:36

1

首先,請勿使用Session.load(),請使用Session.get()。只應在非常特殊的情況下使用load(),這不是其中之一。其次,你是否在同一會話中執行兩個操作?如果是這樣,Hibernate將在第一次操作後緩存實體。沒有辦法阻止它這樣做。但是,您可以在會話上使用evict()以強制將實體踢出會話緩存。

+0

1)我實際上首先嚐試使用createQuery(),但我會嘗試使用get()。我還會詳細瞭解get/load之間的區別;) 2)如果你通過「both operations」來表示插入/選擇,它們甚至在不同的機器上。客戶端使用NHibernate(.net),以及使用Hibernate(java)的Web服務。試用了尼克霍爾特所建議的驅逐方法:) – l3dx 2009-08-13 14:00:18