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

某处底:

2010-10-02 07:36:03020 DEBUG NHibernate.AdoNet.AbstractBatcher - 封闭IDbCommand的,开放的IDbCommand S: 0 2010-10-02 07:36:03382 ERROR NHibernate.Event.Default.AbstractFlushingEventListener - 与会话 NHibernate.HibernateException未能进行SYN chronize数据库状态:在执行时发生 例外 批查询---> System.Data.S qlClient.SqlException:超时 已过期。在完成操作 之前已经超时了 或者服务器没有响应。在 System.Data.SqlClient.SqlConnection.OnError(SQLEXCEPTION 例外,布尔breakConnection)

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

+0

一个Web应用程序,我假设? – hardba11 2010-10-02 04:56:49

+0

对不起,没有说明这一点。不,这是常规的桌面应用程序。 – Alex 2010-10-02 05:21:00

+0

您使用批处理('adonet.batch_size'> 0)吗?为什么你有一个ActiveRecord配置*和*一个单独的NHibernate配置?什么样的SQL语句超时(更新/插入/选择/删除)?你使用的是什么版本的NHibernate和ActiveRecord? – 2010-10-02 16:23:10

回答

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开发人员确认。

+0

谢谢,Mauricio! – Alex 2010-10-03 21:25:09

+0

我试图增加超时时间(从1000到10000)和减少的批量大小(从1000到100),现在我得到异常NHibernate.TransactionException:事务没有连接,或者在批量操作的相当随机的地方断开连接。为什么? – Alex 2010-10-04 06:08:25

+0

嗯......我再次得到超时异常,对于如此长的超时值是不可能的。我的一个朋友说我使用的Nhibernate TransactionScope不使用自定义超时。你知道任何解决方法来填充从配置文件到TransactionScope的超时吗? – Alex 2010-10-04 07:42:00