2009-12-19 83 views
1

我正在開發具有共享單一,延遲加載SQLite數據庫文件中的多個程序,使用功能NHibernate(自動映射)作爲數據項目多程序訪問接入層。功能NHibernate - 需要一個單一的,延遲加載SQLite數據庫

我公司開發的第一個程序(我們稱之爲程序1)保持會話開放所有的時間和延遲加載的罰款。

這種方法失敗,當我計劃2運行,並試圖在程序1正在運行從程序2寫入數據庫 - 我有「的數據庫鎖定」例外。

我通過在程序1啓動後關閉會話來解決這個問題 - 例如,

 private ISessionFactory _sessionFactory; 
     private ISession _session; 

     _sessionFactory = Database.CreateSessionFactory(); 

     _session = _sessionFactory.OpenSession(); 
     _session.BeginTransaction(); 

     // ... read the database here 

     _session.Close(); 

當然,這打破了延遲加載的程序1,當用戶選擇了不同的數據數據從用戶界面設置 - 這是我的預期。

我想我可以只再次打開會話每當用戶選擇新的數據,然後再次關閉它 - 例如,

 if (!_session.IsOpen) 
      _session = _sessionFactory.OpenSession(); 

     if (!_session.IsConnected) 
      _session.Reconnect(); 

     _session.BeginTransaction(); 

     // ... read the database here 

     _session.Close(); 

但是到目前爲止,還沒有能夠得到這個工作。當我嘗試讀取數據時,即使我剛剛打開了一個會話,我也會得到「沒有會話或會話已關閉」異常。 (連接測試只是一個實驗,因爲異常跟蹤說了一些關於在斷開連接時拋出惰性異常的情況,但它沒有幫助)

我在做什麼錯?

+0

您能否解釋爲什麼三種服務需要同時共享數據?他們可以合併成一個應用程序?有沒有理由使用SQLite而不是其他技術? – GrayWizardx 2009-12-19 01:51:19

+0

你爲什麼要sql lite? sql lite不支持分佈式事務。 – Paco 2009-12-19 11:17:14

+0

@GrayWizard - 這是一個科學的儀器應用套件。程序1將主要從數據庫中讀取多個測量值用於組分析。同時,Program2將一次收集一次測量結果,並將其寫入數據庫。目前,這兩個程序都將運行在同一臺Windows PC上。把它們作爲單獨的程序似乎是合理的,但也許這是一個錯誤。 – 2009-12-19 21:57:14

回答

0

因爲其他原因重構了某些會話管理代碼後,「數據庫鎖定」異常神祕消失。 (主要更改是使用事務進行所有數據庫訪問,並確保所有事務和會話對象都已正確處置 - 主要通過將它們包含在「使用」塊中)。

This link討論,是由缺少處置造成了類似的問題。我懷疑這可能是我的問題,但我不確定。

的東西去嘗試另一種很好的來源是Database file is inexplicably locked during SQLite commit

在任何情況下,多個節目,目前正在順利讀取和寫入到一個共享的SQLite數據庫。

2

是否有可能爲你建立這是由第一個應用程序啓動稱之爲一個服務層(或註冊爲Windows服務,如果你是在Windows中),然後讓每個人都打電話到該服務,以獲得他們的數據來自?

我不是在談論有一個單獨的服務器,只是一個單獨的服務,您的程序調用。

+0

我想,但這會增加另一層複雜性,我仍然必須解決我現在遇到的同樣的問題。 – 2009-12-19 01:26:22

+1

灰色嚮導是正確的...你正在複製prog1和prog2之間的數據訪問部分。如果您創建管理會話的服務並公開其他兩個程序的查詢對象,則不會出現爭用情況。你甚至可以發瘋,並建立一個SQL解析器,將SQLite變成一個完整的數據庫服務器(只是在開玩笑) – 2009-12-19 01:39:42

+0

經過反思(並且得到了Mike Brown的評論的加強),我意識到你是對的。抱歉不屑一顧。我從來沒有寫過一項服務 - 這有多困難? – 2009-12-19 21:45:36