C# 使用NHibernate管理单例实体的会话

C# 使用NHibernate管理单例实体的会话,c#,nhibernate,singleton,C#,Nhibernate,Singleton,最近,我将NHibernate集成到我们的服务器应用程序中,该应用程序公开了多种服务。核心服务管理一个类的多个实例,我知道建议使用每请求会话模式。到目前为止还不错 另一个服务是SiteSettings服务,它可以有效地管理单个实例:SiteSettings只有一个实例。我也可以使用此服务遵循每请求会话模式,但这似乎有些奇怪。我真的需要为这里的每个请求创建一个新会话吗?为什么不为服务创建一个会话并继续使用它呢?每个请求会话模式的优点之一是会话最终不会缓存模型中的所有对象。但是,由于我将在会话中只加

最近,我将NHibernate集成到我们的服务器应用程序中,该应用程序公开了多种服务。核心服务管理一个类的多个实例,我知道建议使用每请求会话模式。到目前为止还不错

另一个服务是SiteSettings服务,它可以有效地管理单个实例:SiteSettings只有一个实例。我也可以使用此服务遵循每请求会话模式,但这似乎有些奇怪。我真的需要为这里的每个请求创建一个新会话吗?为什么不为服务创建一个会话并继续使用它呢?每个请求会话模式的优点之一是会话最终不会缓存模型中的所有对象。但是,由于我将在会话中只加载一个实例,因此我认为这不应该引起关注。使用IStatelessSession比ISession更好吗

这里是否有其他理由使用每个请求的会话?我想到的一个问题是,如果与DB断开连接,会发生什么情况。即使发生DB错误,我是否可以继续使用相同的会话


另外,我考虑将每个设置存储在自己的列中,这意味着随着设置的更改,我必须更新模式。我发现了这篇文章:,其中一条评论反对使用表存储此类配置设置。我很难想出替代方案(除了序列化整个类并将其存储为blob)。有不同的方法吗?

会话不是线程安全的,所以我认为您的单身汉需要不止一种方法

即使发生DB错误,我是否可以继续使用相同的会话

不,这可能会引发异常,并且您不应该在异常发生后重用会话。我想你应该坚持按请求会话的模式

有不同的方法吗


每个配置可以使用不同的行吗?因此,您的用户对象将具有UserSetting对象的子集合。每个用户设置只是一个键值对。

会话不是线程安全的,所以我认为您的单例可能需要不止一个

即使发生DB错误,我是否可以继续使用相同的会话

不,这可能会引发异常,并且您不应该在异常发生后重用会话。我想你应该坚持按请求会话的模式

有不同的方法吗


每个配置可以使用不同的行吗?因此,您的用户对象将具有UserSetting对象的子集合。每个用户设置都只是一个键值对。

谢谢您的回复。我的站点设置类使用锁,因此只有一个请求被并发处理,但DB error参数解决了这个疑问。在每个配置中使用一行很有趣。但是,它似乎不太安全(即,所有值都是字符串,除非我为每种可能的类型创建不同的列)。感谢您的回复。我的站点设置类使用锁,因此只有一个请求被并发处理,但DB error参数解决了这个疑问。在每个配置中使用一行很有趣。但是,它似乎不太安全(即所有值都是字符串,除非我为每个可能的类型创建不同的列)。