如何确保我的持久性功能是线程安全的
本文关键字:性功能 线程 安全 我的 何确保 确保 | 更新日期: 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将初始化每个设施的次数与您将设施添加到容器的次数完全相同。
因此,如果你做一次,它将被初始化一次,没有必要在那里放置任何锁定。
代码中唯一看起来奇怪的是,您在每个请求上都要重新创建会话工厂。