超时设置为无限时间时超时异常

Ale*_*lex 3 nhibernate timeout castle-activerecord sqlexception command-timeout

在我的C#.NET 3.5应用程序中,我在NHibernate上使用CastleProject ActiveRecord.这是使用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>
Run Code Online (Sandbox Code Playgroud)

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

在某处开始:

2010-10-02 06:29:47746 INFO NHibernate.Driver.DriverBase - 设置ADO.NET命令超时为0秒

到最后的某个地方:

2010-10-02 07:36:03020 DEBUG NHibernate.AdoNet.AbstractBatcher - 闭IDbCommand的,开放的IDbCommand S:0 2010-10-02 07:36:03382 ERROR NHibernate.Event.Default.AbstractFlushingEventListener - 无法SYN chronize数据库状态与会话NHibernate.HibernateException:执行批处理查询---> System.Data.S qlClient.SqlException时发生异常:超时过期.操作完成之前经过的超时时间或服务器没有响应.在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection)

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

Mau*_*fer 5

正确值为0表示没有超时(如MSDN文档中定义),但是当NHibernate的驱动程序在> = 0时将配置值传递给db命令时,批处理程序的条件会检查该值是否> 0.

因此,当您设置批处理时,超时值为0时,该值不会转移到db命令,因此它将保持默认状态.

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

请与NHibernate开发人员确认一下.