2012-02-08 54 views
2

我使用流暢的NHibernate和Sqlite來構建一個winform系統。系統啓動時有很多線程在運行。所以我使用每個會話的每個線程策略來解決會話併發問題。然後我發現不同會話之間的數據不一致。所以,我開始使用二級緩存來共享不同會話中的數據。但是,我仍然發現我通過一個會話更新對象,然後通過另一個會話獲取更新的對象,我發現返回的對象是陳舊的。 我猜想,當數據更新時,二級緩存不會通知第一級緩存。如何解決它?不同會話之間的NHibernate數據不一致

配置:

  1. 第二級緩存提供:NHibernate.Caches.SysCache

  2. 流利映射:Cache.ReadWrite();在類圖

+0

顯示您的一些數據訪問代碼可能會幫助我們幫助您。 – Maggie 2012-02-08 03:16:49

回答

1

您應該將每個會話用作工作單元。完成後,處置它,並獲得您需要的下一個會話中的新會話。

+0

但是,在winform應用中,很難找到合適的會話配置機會 我認爲我們可以配置在二級緩存更新時通知每個會話緩存。知道如何配置它? – 2012-02-08 03:45:09

+0

會話是一個工作單元。 – RKitson 2012-02-08 03:54:21

+0

一點都不難。通常你的用戶請求數據。一旦你檢索了它,你就不需要這個會話。然後你的應用程序擁有它並且它們可以工作有一段時間,如果他們保存,這是另一個UoW。再次,當你完成處置。 – Andy 2012-02-08 03:57:02

0

您的更改實際上使它到數據庫的唯一方法是通過會話刷新。

有3個事件導致會話刷新: 1.通過調用session.flush()告訴它; 2.會話正在關閉 3.選擇語句即將執行

如果您尚未觸發刷新,那麼您的數據還不在數據庫中。

+0

感謝您的回答。 我在提交事務時刷新會話。我確信第一次會議將數據更新到數據庫。問題在於其他會話不是從第二級緩存更新對象,而是從會話緩存中獲取舊數據。我猜想二級緩存在數據更新時不會通知第一級緩存。 更多理想?提前致謝。 – 2012-02-08 03:36:58

+0

你爲什麼確定?你是否在適當的時候檢查了數據庫的正確值? (即在第二次會話中選擇數據之前添加一個斷點並實際查看數據庫中的數據? – RKitson 2012-02-08 03:56:21

+0

是的,我檢查了數據庫,我想我應該找到配置會話高速緩存刷新策略的方法。 ,我不知道如何配置 – 2012-02-08 05:51:36