gpt4 book ai didi

c# - 确保 NHibernate SessionFactory 只创建一次

转载 作者:可可西里 更新时间:2023-11-01 07:53:55 25 4
gpt4 key购买 nike

我编写了一个 NHibernateSessionFactory 类,它包含一个静态 Nhibernate ISessionFactory。这用于确保我们只有一个 session 工厂,并且第一次调用 OpenSession() 时我创建了实际的 SessionFactory - 下次我使用它并在其上打开一个 session 。代码如下所示:

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 中使用某种排队或等待机制,但我不确定该怎么做。以前有人遇到过同样的问题吗?什么是最好的解决方案?

最佳答案

sessionFactory 必须是线程安全的单例。

Java 中的一个常见模式是在静态初始化程序中构建 sessionFactory。参见 HibernateUtil .您可以在 C# 中执行相同的操作。

还有其他patterns实现单例,包括使用锁或同步部分。如果我理解正确的话,这里有一些细微的变体应该可以解决您的问题。

static readonly object factorylock = new object();

public ISession OpenSession()
{
lock (factorylock)
{
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();
}

关于c# - 确保 NHibernate SessionFactory 只创建一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2362195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com