我正在開發具有共享單一,延遲加載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();
但是到目前爲止,還沒有能夠得到這個工作。當我嘗試讀取數據時,即使我剛剛打開了一個會話,我也會得到「沒有會話或會話已關閉」異常。 (連接測試只是一個實驗,因爲異常跟蹤說了一些關於在斷開連接時拋出惰性異常的情況,但它沒有幫助)
我在做什麼錯?
您能否解釋爲什麼三種服務需要同時共享數據?他們可以合併成一個應用程序?有沒有理由使用SQLite而不是其他技術? – GrayWizardx 2009-12-19 01:51:19
你爲什麼要sql lite? sql lite不支持分佈式事務。 – Paco 2009-12-19 11:17:14
@GrayWizard - 這是一個科學的儀器應用套件。程序1將主要從數據庫中讀取多個測量值用於組分析。同時,Program2將一次收集一次測量結果,並將其寫入數據庫。目前,這兩個程序都將運行在同一臺Windows PC上。把它們作爲單獨的程序似乎是合理的,但也許這是一個錯誤。 – 2009-12-19 21:57:14