English 中文(简体)
您如何根据HTTP请求更改NHibernate的连接字符串?
原标题:
  • 时间:2009-01-29 10:28:09
  •  标签:

以上真的。

最佳回答

一个ISessionFactory.OpenSession()可以提供一个IDbConnection

另一个选项是实现一个,它将根据某些条件创建适当的实例(这必须是全局的条件,因此使解决方案不是非常干净)。

问题回答

请注意,当向OpenSession()提供IDbConnection时,您将无法使用第二级缓存。

请阅读https://forum.hibernate.org/viewtopic.php?f=25&t=959178

... "This is not a bug. If you are managing your own connections, NHibernate disables the use of second-level cache for the session to be safe."...

嗯,这可能有些棘手,我认为不应该这样做,但这是个想法:

var cfg = new Configuration(); // Get a new NHibernate Configuration
cfg.SetProperty("connection.connection_string", yourConnectionString); // Alter the property
cfg.Configure(); // Configure with this configuration
var sf = cfg.BuildSessionFactory(); // Get a new ISessionFactory

我不知道这是否是最好的方法,但可能起作用。您也可以有2个配置XML文件,并执行以下操作:

var cfg = new Configuration("hibernate1.cfg.xml"); // OR
var cfg = new Configuration("hibernate2.cfg.xml"); 

针对评论,您可以初始化并准备好多个会话工厂,但这并不算是“更改连接字符串”。然后选择您需要的那个。昂贵的部分是创建 Configuration 对象并调用 Configure()。

还有 NHibernate Burrow 库,可以同时管理多个会话,并根据实体选择正确的会话。

var session = new BurrowFramework().GetSession(); // default session
var session = new BurrowFramework().GetSession(typeof(Entity)); // session that manages Entity class

SessionFactory是设置连接、方言等的所在,因此如果您想更改连接字符串,您需要重新配置。但是,是的,您的评论是正确的。设置会话工厂是最昂贵的操作之一,因此您只希望在需要时执行它,而从不进行任何更多操作。

在nHibernate Burrow中有一些真正的伟大会话概念。如果您查看他们如何管理会话,您可能会发现一些创意想法,以管理跨多个数据库的多个会话。

我有一个建议,与@Marc的原则相同:您可以在提供者中封装动态连接。请参阅关于动态连接提供程序的nhibernate.info维基百科。您可以轻松地构建一个提供者,在其中传递您需要的信息,以便建立指向所需数据库的会话。

我正在使用nHibernate 2.0在100多个数据库上(所有数据库具有相同的架构,但物理上分离的数据),因此只要稍加关注就可以完成;-)





相关问题
热门标签