如何确保我的持久性功能是线程安全的

本文关键字:性功能 线程 安全 我的 何确保 确保 | 更新日期: 2023-09-27 17:58:10

我已经按照同样的思路,按照castle windsor教程为nhibernate实现了我的持久性功能。

参见:

http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashxhttp://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Seven-Lifestyles.ashx

我在我的应用程序中注意到,当池被释放并再次尝试访问它时,我最初会收到与正在构建的会话工厂有关的错误。

比如,添加了重复密钥等。

我认为这与我的映射关系不大,更多的是与设施执行的方式或时间有关。

经过更多的研究,我看到有人说会话工厂应该是线程安全的?

如果这是正确的,那么我的假设是,我不能仅仅依靠温莎城堡来确保执行的代码只执行一次?

请查看下面我的持久化工具的init方法,我是否应该在init方法中添加更多级别的锁定?

这是正确的做法吗?

我的设施-遵循教程:

public class PersistenceFacility : AbstractFacility
{
    // ... etc.
    protected override void Init()
    {
        Configuration config = BuildDatabaseConfiguration();
        Kernel.Register(Component.For<ISessionFactory>().UsingFactoryMethod(_ => config.BuildSessionFactory()).LifestylePerWebRequest());
        Kernel.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()).LifestylePerWebRequest());
    }
}

我在App_Start中初始化我的容器,并没有真正做任何其他特别的事情,我只是使用我的存储库中的ISession,所有这些都使用CastleWindsor解决。

如何确保我的持久性功能是线程安全的

Windsor将初始化每个设施的次数与您将设施添加到容器的次数完全相同。

因此,如果你做一次,它将被初始化一次,没有必要在那里放置任何锁定。

代码中唯一看起来奇怪的是,您在每个请求上都要重新创建会话工厂。