在我的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)
为什么?如何解决这个问题?
答案 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