是否必须为每个数据库创建一个新的SessionFactor
y 和对象?Session
我有一个用于我的应用程序数据的数据存储,以及一个用于我的员工安全的单独数据存储,用于验证用户。我是否必须为调用 2 个不同的数据库创建一个新的 SessionFactory 和 Session 对象?
2 回答
好的,所以这不会直接回答您的问题,但它可能会提供有关为什么您应该为每个数据存储创建多个会话对象的见解。
本文解释了如何为所需的每种类型的 Session 实现线程安全的惰性单例,这样每个数据存储区只有一个会话,但它在整个应用程序中共享。所以最多你只会有 2 个会话对象。
但是,要直接回答您的问题,您将需要每个数据库 1 个会话对象。
一般情况
一般情况下的答案是否定的,您至少需要针对一般情况进行不同的会话。
您可以通过使用以打开的连接作为参数的重载来使用单个会话工厂OpenSession
,从而允许您为需要它的会话切换数据库。
这有一些缺点,例如在事务后缺少连接自动释放、禁用二级缓存……在我看来,最好有两个会话工厂,而不是在会话打开时提供自己的连接。
数据库特定案例
根据您使用的数据库服务器,您可以使用单个连接字符串通过 NHibernate 访问两者。如果您可以使用单个连接字符串,那么您可以使用单个会话工厂并使用相同的会话来访问在两个数据库之间拆分的实体。
最简单的情况
使用 SQL Server,您可以将两个数据库放在同一个 SQL Server 上。在这种情况下,您可以使用单个连接字符串并调整映射catalog
上的属性,<class>
以告知要在哪个数据库中找到该表。(schema
也可以通过附加一个点来使用。它在 NHibernate 中可用的时间更长,所以对于旧版本,您可能只有schema
.)
当然,连接凭据必须对访问这两个数据库都有效。
其他案例
仍然使用 SQL Server,如果第二个数据库在另一台服务器上,则可以使用链接服务器。您将再次调整catalog
需要它的类上的属性以指定适当的linkedServerName.DbName
.
也许其他数据库可能有类似的解决方案。