我寫了一個NHibernateSessionFactory類,它包含一個靜態的Nhibernate ISessionFactory。這用於確保我們只有一個會話工廠,並且第一次調用OpenSession()時,我創建了實際的SessionFactory - 下次我使用它並在其上打開一個會話。代碼如下所示:確保NHibernate SessionFactory只創建一次
public class NhibernateSessionFactory : INhibernateSessionFactory
{
private static ISessionFactory _sessionFactory;
public ISession OpenSession()
{
if (_sessionFactory == null)
{
var cfg = Fluently.Configure().
Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>());
_sessionFactory = cfg.BuildSessionFactory();
BuildSchema(cfg);
}
return _sessionFactory.OpenSession();
}
private static void BuildSchema(FluentConfiguration configuration)
{
var sessionSource = new SessionSource(configuration);
var session = sessionSource.CreateSession();
sessionSource.BuildSchema(session);
}
}
現在我遇到了問題。我的應用程序分爲客戶端和服務器端。 Nhibernate的東西在服務器端。在啓動時,我的客戶端和服務器都希望通過一些使用NhibernateSessionFactory的服務來訪問數據庫。結果是在請求來自客戶端之前是否創建_sessionFactory的爭用條件。如果不是,它會失敗..
我想我需要在NhibernateSessionFactory某種排隊或等待機制,但我不知道該怎麼做。任何人都有過同樣的問題?什麼是最好的解決方案?
謝謝!聽起來很合理。我剛剛使用Mutex添加了一個解決方案。但我應該用鎖而不是? – stiank81 2010-03-02 10:08:51
但是如果我需要同時連接多個數據庫呢?目前我不知道其他解決方法,以創建多個會話工廠... – JustAMartin 2012-12-07 11:19:13
你如何在控制器中實現這一點? – Chazt3n 2013-01-31 15:52:15