Я написал класс 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
Но что, если мне нужно несколько соединений с базой данных одновременно? В настоящее время я не знаю другого способа обхода, чтобы создать несколько сессионных заводов ... – JustAMartin
Как вы реализуете это в контроллерах? – Chazt3n