【问题标题】:Is there a way to reuse a NHibernate SessionFactory for multiple databases?有没有办法为多个数据库重用 NHibernate SessionFactory?
【发布时间】:2012-09-26 12:55:42
【问题描述】:

正如标题所说,有没有办法为多个数据库“重用”SessionFactory?由于实例化SessionFactory 需要时间,我想知道是否可以将这些实例合并并重用它们,只更改连接/数据库名称。显然,一级缓存会被清除,但我试图避免实例化工厂本身所涉及的惩罚。

背景是我可以拥有几个具有完全相同架构的小型“可插拔”数据库,因此 NHibernate 无需每次都重新构建所有映射。

【问题讨论】:

    标签: .net nhibernate sessionfactory pooling


    【解决方案1】:

    您可以通过首先打开适用于目标数据库的标准 ADO.NET Connection 对象并将其传递给 NH SessionFactory 实例,为不同的数据库从同一会话工厂动态创建 Session 实例,如下所示:

        var connection = new SqlConnection("target DB connection string");
        var session = sessionFactory.OpenSession(connection);
        CurrentSessionContext.Bind(session);
    

    我建议您使用 Dependency Injection 容器来控制 ADO.NET 连接实例的生命周期和处置,而不是如上所示的简化代码所示直接创建它。

    另一个问题是 NHibernate 在 SessionFactory 实例启动时执行数据库访问,因此您需要在 hibernate.cfg.xml 文件中提供有效的连接字符串或将其动态注入到会话工厂配置逻辑中。

    更新:

    Groo 提供了一个link to a great post 在 NHibernate 中动态切换数据库。遵循该帖子中的建议,而不是像上面显示的示例代码那样做。

    【讨论】:

    • +1 谢谢,我在发布问题后意识到存在这种重载,但是this link here 提到了一些事务问题:[使用此重载时] 二级缓存将被禁用跟踪同一事务中的语句。这实际上意味着您在尝试从事务中调用 ISession.Save(object obj) 时遇到这些讨厌的错误之一。你有过类似的经历吗?
    • 我们通过我们的工作单元实施来处理这个问题。它接收连接,在 Session 实例上执行 BeginTransaction(),并填充模块级字段以保存它返回的 NHibernate ITransaction 实例。它根据处理的状态显式调用Commit()Rollback()。当数据库需要很长时间来处理 NHibernate 请求但回滚处理时,我们遇到了问题。
    • 抱歉,刚刚看到链接,我们的流程确实是面向写的,所以我们还没有看到这种问题。
    • 我们确实实现了与CreateSessionFactory 的帖子中的代码非常相似的东西,这就是我在关于会话工厂配置的答案中所指的内容。那篇文章中的代码看起来很可靠,如果我知道的话,我会包含那个链接。谢谢分享!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2011-01-18
    • 2021-01-10
    • 2022-01-03
    • 2015-06-16
    相关资源
    最近更新 更多