休眠一个 isession 相同的 idbconnection
Posted
技术标签:
【中文标题】休眠一个 isession 相同的 idbconnection【英文标题】:nhibernate one isession same idbconnection 【发布时间】:2011-07-14 02:31:36 【问题描述】:我有一些代码在同一个 ISession 上执行了 2 次 session.Get(id)。我可以看到 ISession 创建了 2 个 idbconnections。我想这是因为某种配置。我希望它在同一个 idbconnection 上进行提取。怎么样?
【问题讨论】:
【参考方案1】:如果两个Get
操作在同一个事务中,它们将共享同一个IDbConnection
。否则,您最终会得到隐式事务,NHibernate 将为每个查询打开和关闭 IDbConnection
。一般来说,您应该尝试执行以下操作:
using (var tx = session.BeginTransaction())
var customer = session.Get<Customer>(123);
var order = session.Get<Order>(456);
// do stuff
tx.Commit();
Use of implicit transactions is discouraged:
当我们不定义自己的 交易,它回落到 隐式事务模式,其中每个 对数据库的语句在其运行 自己的交易,导致大 性能成本(数据库时间 建立和拆除交易),和 降低一致性。
即使我们只是读取数据,我们 应该使用事务,因为 使用事务确保我们得到 来自数据库的一致结果。 NHibernate 假定所有访问 数据库是在一个 交易,并强烈反对 任何会话的使用都没有 交易。
【讨论】:
谢谢迈克尔,这很好用。但是没有事务就不可能拥有长期存在的 idbconnections 吗? 找到了 connection.release_mode = on_close 做我想做的事。以上是关于休眠一个 isession 相同的 idbconnection的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate ISession 与 Castle Windsor IoC 的循环依赖