【问题标题】:Timeout exception when timeout set to infinite time超时设置为无限时间时的超时异常
【发布时间】:2010-10-02 04:01:33
【问题描述】:

在我的 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 : 0 2010-10-02 07:36:03,382 错误 NHibernate.Event.Default.AbstractFlushingEventListener - 无法将数据库状态与会话同步 NHibernate.HibernateException:一个 执行时发生异常 批量查询---> System.Data.S qlClient.SqlException:超时 已到期。超时时间已过 手术完成前 或者服务器没有响应。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection)

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

【问题讨论】:

  • 这是我假设的网络应用程序?
  • 对不起,没有说明这一点。不,这是常规的桌面应用程序。
  • 你在使用批处理 (adonet.batch_size > 0) 吗?为什么你有一个 ActiveRecord 配置一个单独的 NHibernate 配置?哪种 SQL 语句超时(更新/插入/选择/删除)?您使用的是哪个版本的 NHibernate 和 ActiveRecord?
  • @Mauricio:是的,我使用的是 batch_size=1000。我有两种配置,因为过去我遇到过这样的情况,即一个键在 ActiveRecord 部分中定义,而另一个仅适用于 Nhibernate,所以我决定两者都有(也许这是错误的)。语句是插入,批量插入。 Nhibernate 是 2.1.2.4000,CastleProject 是 2.1.0.6692。
  • 我有一个理论...尝试将batch_size设置为0,看看它是否仍然超时。请把结果发回这里。

标签: nhibernate timeout castle-activerecord sqlexception command-timeout


【解决方案1】:

值 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 开发人员确认这一点。

【讨论】:

  • 我尝试增加超时时间(从 1000 到 10000)并减少批量大小(从 1000 到 100),现在我得到异常 NHibernate.TransactionException: Transaction not connected, or was disconnected on相当随机的地方我的批处理操作。为什么?
  • 嗯...我再次遇到超时异常,对于如此长的超时值来说这是不可能的。我的一位朋友说我使用的 Nhibernate TransactionScope 不使用自定义超时。您知道将超时从配置文件填充到 TransactionScope 的任何解决方法吗?
  • @Alex:请发布另一个问题。
  • 如何通过fluent nhibernate设置批处理器连接超时?
【解决方案2】:

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

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

How to set Nhibernate LINQ Command Timeout using Session.Query

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2021-11-23
    • 2015-01-09
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多