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

时间:2010-10-02 04:01:33

标签: 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>

但是,我仍然收到超时异常! 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,打开IDbCommand:   0 2010-10-02 07:36:03,382错误   NHibernate.Event.Default.AbstractFlushingEventListener    - 无法使用会话同步数据库状态   NHibernate.HibernateException:An   执行时发生异常   批量查询---&gt; System.Data.S   qlClient.SqlException:超时   过期。超时时间已过   在完成操作之前   或服务器没有响应。在   System.Data.SqlClient.SqlConnection.OnError(SQLEXCEPTION   exception,Boolean breakConnection)

为什么?如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

值为0表示没有超时(defined in the MSDN docs)是正确的,但是NHibernate's driver passes the config value to the db command when it's >= 0时,批处理器的条件为checks that the value is > 0

因此,当您设置批处理时,超时值为0时,该值不会转移到db命令,因此它仍然是默认值。

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

请与NHibernate开发人员确认。

答案 1 :(得分:0)

您可能希望设置特定查询的超时而不是web.config级别(否则您确实需要调整应用程序:))。

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

How to set Nhibernate LINQ Command Timeout using Session.Query