Asp.net 能否使用1个NHibernate会话查询同一服务器上的不同数据库?
是否必须为每个数据库创建新的Asp.net 能否使用1个NHibernate会话查询同一服务器上的不同数据库?,asp.net,nhibernate,Asp.net,Nhibernate,是否必须为每个数据库创建新的SessionFactory和Session对象?我有一个用于应用程序数据的数据存储,还有一个用于员工安全的单独数据存储,用于验证用户。我是否必须为对两个不同数据库的调用创建一个新的SessionFactory ans会话对象?好的,因此这并不能直接回答您的问题,但它可能会让您了解为什么应该为每个数据存储创建多个会话对象 解释如何为所需的每种类型的会话实现线程安全的惰性单例,以便每个数据存储只有一个会话,但它在整个应用程序中共享。所以最多只能有两个会话对象 但是,要直
SessionFactor
y和Session
对象?我有一个用于应用程序数据的数据存储,还有一个用于员工安全的单独数据存储,用于验证用户。我是否必须为对两个不同数据库的调用创建一个新的SessionFactory ans会话对象?好的,因此这并不能直接回答您的问题,但它可能会让您了解为什么应该为每个数据存储创建多个会话对象
解释如何为所需的每种类型的会话实现线程安全的惰性单例,以便每个数据存储只有一个会话,但它在整个应用程序中共享。所以最多只能有两个会话对象
但是,要直接回答您的问题,您需要每个数据库有一个会话对象。好的,因此这并不能直接回答您的问题,但它可能会提供一个见解,说明为什么您应该为每个数据存储创建多个会话对象 解释如何为所需的每种类型的会话实现线程安全的惰性单例,以便每个数据存储只有一个会话,但它在整个应用程序中共享。所以最多只能有两个会话对象 但是,要直接回答您的问题,每个数据库需要一个会话对象。一般情况 一般案例的答案是否定的,对于一般案例,您至少需要不同的会话 您可以使用单个会话工厂,方法是使用
OpenSession
重载,将打开的连接作为参数,允许您为需要它的会话切换数据库
这有一些缺点,比如缺少事务后自动释放的连接,禁用二级缓存。。。我认为最好有两个会话工厂,而不是在会话打开时提供自己的连接
数据库特定案例
根据您使用的数据库服务器的不同,您可以使用一个连接字符串通过NHibernate访问这两个数据库。如果可以使用单个连接字符串,则可以使用单个会话工厂并使用同一会话访问在两个数据库之间拆分的实体
最简单的情况
使用SQL Server,您的两个数据库可能位于同一SQL Server上。在这种情况下,您可以使用单个连接字符串并调整
映射上的catalog
属性,以告知要在哪个数据库中找到表。(schema
也可以通过添加一个点来使用。它在NHibernate中可用,因为时间更长,所以对于旧版本,您可能只有schema
)
当然,连接凭据必须对访问这两个数据库有效
其他情况
仍然使用SQL Server,如果第二个数据库位于另一台服务器上,则可以使用链接服务器。对于需要它来指定适当的linkedServerName.DbName
的类,您需要再次调整catalog
属性
也许其他数据库也有类似的解决方案。一般情况
一般案例的答案是否定的,对于一般案例,您至少需要不同的会话
您可以使用单个会话工厂,方法是使用OpenSession
重载,将打开的连接作为参数,允许您为需要它的会话切换数据库
这有一些缺点,比如缺少事务后自动释放的连接,禁用二级缓存。。。我认为最好有两个会话工厂,而不是在会话打开时提供自己的连接
数据库特定案例
根据您使用的数据库服务器的不同,您可以使用一个连接字符串通过NHibernate访问这两个数据库。如果可以使用单个连接字符串,则可以使用单个会话工厂并使用同一会话访问在两个数据库之间拆分的实体
最简单的情况
使用SQL Server,您的两个数据库可能位于同一SQL Server上。在这种情况下,您可以使用单个连接字符串并调整
映射上的catalog
属性,以告知要在哪个数据库中找到表。(schema
也可以通过添加一个点来使用。它在NHibernate中可用,因为时间更长,所以对于旧版本,您可能只有schema
)
当然,连接凭据必须对访问这两个数据库有效
其他情况
仍然使用SQL Server,如果第二个数据库位于另一台服务器上,则可以使用链接服务器。对于需要它来指定适当的linkedServerName.DbName
的类,您需要再次调整catalog
属性
也许其他数据库也可以有类似的解决方案。我已经为使用1个单例会话对象实现了这个方法。我刚刚向HttpModule添加了第二个会话。我只是想知道这是否必要。我想是的。感谢您提供的信息性答案。我已经在使用1个单例会话对象实现此方法。我刚刚向HttpModule添加了第二个会话。我只是想知道这是否必要。我想是的。谢谢你提供了翔实的答案。