在我的 C# .NET 3.5 应用程序中,我使用 CastleProject ActiveRecord 而不是 NHibernate。这是使用 MS SQL Server 2008 的桌面应用程序。我已将 ADO 命令超时设置为 0,以防止批量操作期间出现超时异常:

  <activerecord>
    <config>
      ...
      <add key="hibernate.command_timeout" value="0" />
    </config>
  </activerecord>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      ...
      <property name="command_timeout">0</property>
    </session-factory>
  </hibernate-configuration>

但是,我仍然收到超时异常!NHibernate 日志显示如下:

在开头的某个地方:

2010-10-02 06:29:47,746 INFO NHIBERNATE.DRIVER.DRIVERBASE-设置ADO.NET命令超时到0秒

在最后的某个地方:

2010-10-02 07:36:03,020 debug nhibernate.adonet.AbstractBatcher-封闭的IDBCommand,Open IDBCommand S:0 2010-10-02 07:36:03,382错误nhibernate.Event.default.AbstractFlushingEventListener-无法与session nhibernate.hibernate.HibernateException合成数据库状态:执行批次查询时发生了例外---> system.data.s qlclient.sqlexception:超时到期。在完成操作或服务器完成之前已经经过的超时期未响应。在system.data.sqlclient.sqlconnection.onerror(sqlexception异常,布尔旋转)

怎么会?如何解决这个问题?

有帮助吗?

解决方案

值 0 表示没有超时,这是正确的(如 MSDN 文档中定义),然而当 当配置值 >= 0 时,NHibernate 驱动程序将配置值传递给 db 命令, 配料机的条件 检查该值是否 > 0.

因此,当您设置批处理且超时值为 0 时,该值不会传递到 db 命令,因此它仍为默认值。

这完全有可能是设计使然,并且 NHibernate 开发人员故意禁用批处理场景的超时。无论如何,禁用超时都是一个坏主意,如果您遇到超时错误,我会提高该值,但不会禁用它。

请与 NHibernate 开发人员确认这一点。

其他提示

您可能会寻求建立没有web.config文件级别(否则你真的需要调整您的应用程序:))具体查询超时和。

最近,我发现这个答案,帮助我:

如何NHibernate的LINQ命令超时使用会话设置.Query

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top