休眠一个 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Moq 模拟 NHibernate ISession

NHibernate Isession管理

NHibernate ISession 与 Castle Windsor IoC 的循环依赖

在 Visual Studio 2015 中调试时无法解析参数名称类型 ISession

为啥 ISession 保存不插入?

如何将 [] 索引应用于“ISession”类型的表达式?