超时设置为无限时间时出现超时异常
-
27-09-2019 - |
题
在我的 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文件级别(否则你真的需要调整您的应用程序:))具体查询超时和。
最近,我发现这个答案,帮助我: