您可以使用1个NHibernate会话在同一服务器上查询不同的数据库吗?

时间:2008-09-11 13:53:32

标签: asp.net nhibernate

是否必须为每个数据库创建新的SessionFactor y和Session对象?我有一个用于我的应用程序数据的数据存储,以及一个用于我的员工安全性的单独数据存储,用于验证用户。我是否必须为调用2个不同的数据库创建一个新的SessionFactory和Session对象?

2 个答案:

答案 0 :(得分:1)

好的,所以这不能直接回答你的问题,但它可以提供一个洞察,说明为什么你应该为每个数据存储区创建多个会话对象。

This article解释了如何为每种类型的Session实现线程安全的懒惰单例,这样每个数据存储只有一个会话,但它在整个应用程序中共享。所以最多只有2个会话对象。

要直接回答您的问题,每个数据库需要1个会话对象。

答案 1 :(得分:0)

一般情况

一般情况答案是否定的,一般情况下至少需要不同的会话。

您可以使用OpenSession重载使用单个会话工厂,将打开的连接作为参数,允许您为需要它的会话切换数据库。

这有一些缺点,例如交易后缺少连接自动释放,禁用二级缓存,......我认为最好有两个会话工厂,而不是在会话开放时提供自己的连接。

数据库特定情况

根据您使用的数据库服务器,您可以使用单个连接字符串来访问NHibernate。如果您可以使用单个连接字符串,那么您可以使用单个会话工厂并使用相同的会话来访问在两个数据库之间拆分的实体。

最简单的案例

使用SQL Server,您可能在同一个SQL Server上拥有两个数据库。在这种情况下,您可以使用单个连接字符串并调整catalog映射上的<class>属性,以告知在哪个数据库中找到该表。 (schema也可以通过附加一个点来使用。它在NHibernate中可用的时间更长,所以对于旧版本,你可能只有schema。)

当然,连接凭证必须对访问这两个数据库都有效。

其他情况

仍在使用SQL Server,如果第二个数据库在另一台服务器上,则可以使用链接服务器。您将再次调整需要它的类的catalog属性,以指定相应的linkedServerName.DbName

也许其他数据库可能有类似的解决方案。