【问题标题】:How can I ensure my persistence facility is thread safe?如何确保我的持久性设施是线程安全的?
【发布时间】:2016-12-31 21:43:37
【问题描述】:

我已经按照城堡温莎教程的相同思路实现了我的 nhibernate 持久性工具。

见:

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

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

诸如添加重复键之类的东西。

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

在进行更多研究后,我看到人们说session factory should be thread safe?

如果这是正确的,那么我的假设是我不能单独依靠 Castle Windsor 来确保执行的代码只会执行一次?

请查看我的持久性设施下面的初始化方法,我是否应该在初始化方法中添加更多级别的锁定?

这会是正确的地方吗?

我的设施 - 遵循教程:

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 解决。

【问题讨论】:

    标签: c# asp.net-mvc fluent-nhibernate thread-safety castle-windsor


    【解决方案1】:

    Windsor 将启动每个设施的次数与您将设施添加到容器中的次数完全相同。

    所以如果你做一次,它会被初始化一次,不需要在那里加任何锁。

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

    【讨论】:

    • 如果多个线程同时启动,可能存在线程问题?
    • 多线程启动什么?不应该有多个线程运行您的引导代码,如果您确实以这种方式构建它,那么您可能需要重新考虑它
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2018-12-07
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多