更改NHibernate Session.Save命令超时时间

13

我们有一些长时间运行的后端进程,比默认的30秒要花费更长的时间。

我们的NHibernate版本是2.0.1.4000,Spring.NET是1.2.0.20313。 NHibernate是通过以下方式配置的Spring.NET:

<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate20">
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="MappingAssemblies">
        <list>
            <value>SomeKindOfAnItem</value>
        </list> 
    </property>
    <property name="HibernateProperties">
        <dictionary>
            <entry key="expiration" value="120"/>
            <entry key="adonet.batch_size" value="10"/>
            <entry key="cache.provider_class" value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache"/>
            <entry key="cache.use_query_cache" value="true"/>
            <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
            <entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
            <entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>
            <entry key="current_session_context_class" value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate20"/>
            <entry key="show_sql" value="false"/>
        </dictionary>
    </property>
</object>
为了解决这个问题,我正在尝试在 Web.config 中将 NHibernate command_timeout 设置为 60。 以下是 Web.config 中的内容:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="command_timeout">60</property>
  </session-factory>
</hibernate-configuration>

很不幸,这并不起作用,命令在30秒后超时。

我建了一个控制台应用程序,就像Web应用程序一样调用DAO。 在其配置文件中具有完全相同的NHibernate配置设置。 使用成功从配置文件中的设置,IDbCommand超时时间为60秒,而不是30秒。

我尝试调试应用程序,并检查DAO程序集从网站调用时是否设置了commandTimeout。它已经被设置了。

下面是来自Visual Studio watch的信息:

((NHibernate.Driver.DriverBase)(((NHibernate.Connection.DriverConnectionProvider) ((NHibernate.Impl.SessionFactoryImpl)session.SessionFactory) .ConnectionProvider).Driver)).commandTimeout: 60

创建会话的方式如下:

ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);

我的问题是:如果我从Web.config中成功将命令超时字段设置为60,那么为什么它在30秒后超时?有什么解决方法吗?


如果您发布一个能够重现问题的小示例程序,将会非常有帮助。编写这个小示例程序可能会让您清楚地知道为什么它不能正常工作。 - Michael Maddox
很好的想法,但我已经做过了。我建立了一个控制台应用程序来复制问题,但控制台应用程序可以工作而网页应用程序不能。 - adomokos
1个回答

12
你可以将超时设置为hibernate.connection.connection_string属性的一部分。我没有使用过Spring.Net,所以不确定它如何设置NHibernate会话工厂。如果你能在连接字符串中添加“Connect Timeout=120”,这应该将默认的30秒超时时间增加到120秒。
以下代码将放置在web.config中:
<property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=; Connect Timeout=120;</property>

编辑

事实上有两个超时时间,感谢adomokos指出这一点。一个用于连接的实际打开和另一个用于执行查询。

上面显示了连接的那个超时时间,但是要设置NHibernate查询的超时时间,则需要使用ICriteria接口。

ICriteria crit = session.CreateCriteria(typeof(Foo)); 
crit.SetTimeout(120); 
List<Foo> fooList = crit.List();

超时时间以秒为单位。

希望这有所帮助。


6
有两种不同的超时时间: 1)连接超时 2)命令超时你建议更改第一种超时时间,但我需要设置第二种。请阅读此链接以获取更多详细信息:http://tinyurl.com/ybpwkvl - adomokos
你尝试过在 ICriteria 接口上使用 SetTimeout 吗?这可能是你真正想要的。 - Nathan Fisher
我不确定是否有访问 ICriteria 的权限。我正在尝试通过 HibernateTemplate 保存对象:HibernateTemplate.SaveOrUpdate(entity); HibernateTemplate.Flush(); - adomokos
如果你拥有session对象,那么可以使用Session.CreateCriteria创建一个criteria。我会进一步解释我的答案。 - Nathan Fisher
请查看http://www.springframework.net/doc-1.1-M1/sdk/1.1/html/Spring.Data.NHibernate~Spring.Data.NHibernate.HibernateTransactionManager.html,它可能会给你一些想法。 - Nathan Fisher
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接