【问题标题】:Managing sessions for a singleton entity with NHibernate使用 NHibernate 管理单例实体的会话
【发布时间】:2011-07-15 13:22:01
【问题描述】:

最近我一直在将 NHibernate 集成到我们的服务器应用程序中,该应用程序公开了多个服务。核心服务管理一个类的多个实例,我理解建议使用 session-per-request 模式。到目前为止一切顺利。

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

还有其他理由在这里使用 session-per-request 吗?想到的一个问题是在与数据库断开连接的情况下会发生什么。即使出现数据库错误,我是否可以继续使用相同的会话?

顺便说一句,我正在考虑将每个设置存储在自己的列中,这意味着我必须在设置更改时更新架构。我发现了这篇文章:NHibernate Web Application - Managing User Preferences,其中一个 cmets 反对使用表来存储此类配置设置。我很难想出替代方案(没有序列化整个类并将其存储为 blob)。有不同的方法吗?

【问题讨论】:

    标签: c# nhibernate singleton


    【解决方案1】:

    会话不是线程安全的,所以我认为您的单身人士需要多个会话

    即使出现数据库错误,我还能继续使用同一个会话吗?

    不,大概这会引发异常,并且您不应该在异常发生后重用会话。恕我直言,您应该坚持按请求模式进行会话。

    有不同的方法吗?

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

    【讨论】:

    • 感谢您的回复。我的站点设置类使用锁,因此只有一个请求同时进行,但 DB 错误参数解决了这个问题。
    • 使用 row-per-config 很有趣。不过,它似乎不太安全(即所有值都是字符串,除非我为每种可能的类型创建不同的列)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2023-03-25
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多