2012-10-05 54 views
2

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

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

回答

5

您可以动态地先打开一个标准的ADO.NET Connection对象适合目标数据库,并把它传递给NH SessionFactory例如像这样创建从同一个会话工厂对于不同的数据库Session实例:

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

我建议您使用依赖注入容器来控制ADO.NET连接实例的生存期和处置,而不是直接创建它,如上面显示的简化代码所示。

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

UPDATE:

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

+1

+1谢谢,我意识到这个超负荷存在后,我发布的问题,但[此链接](http://patrickhuber.wordpress.com/2011/10/25/change-connectionstring-nhibernate/)提到一些事务的问题:* [当使用这个重载时]二级缓存将被禁止用于同一事务中的跟踪语句。这实际上意味着当你尝试从一个事务*中调用ISession.Save(object obj)时,你会遇到这些令人讨厌的错误之一。你有类似的经历吗? – Groo

+0

我们通过我们的工作单位执行处理。它接收连接,在'Session'实例上执行一个BeginTransaction(),并填充一个模块级别的字段来存放它返回的NHibernate的'ITransaction'实例。它根据处理的状态显式调用'Commit()'或'Rollback()'。当数据库花费很长时间来处理NHibernate请求但干净地回滚处理时,我们遇到了问题。 –

+0

对不起,刚刚看到链接,我们的流程确实是以写入为导向的,所以我们没有看到这种问题。 –

相关问题