3

在我的 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 信息 NHibernate.Driver.DriverBase - 将 ADO.NET 命令超时设置为 0 秒

在最后的某个地方:

2010-10-02 07:36:03,020 调试 NHibernate.AdoNet.AbstractBatcher - 关闭 IDbCommand,打开 IDbCommand s:0 2010-10-02 07:36:03,382 错误 NHibernate.Event.Default.AbstractFlushingEventListener - 无法同步数据库状态with session NHibernate.HibernateException: 执行批量查询时发生异常---> System.Data.SqlClient.SqlException: Timeout expired。在操作完成之前超时时间已过或服务器没有响应。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection)

怎么来的?如何解决这个问题?

4

2 回答 2

5

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

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

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

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

于 2010-10-03T13:10:37.860 回答
0

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

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

如何使用 Session.Query 设置 Nhibernate LINQ 命令超时

于 2014-03-25T21:00:53.107 回答