更改NHibernate Session.Save命令超时

ado*_*kos 12 .net nhibernate timeout application-settings

我们有几个长时间运行的后端进程需要比默认的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>
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我试图在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>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,命令在30秒后超时.

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

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

这是来自Visual Studio观看:

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

会话创建如下:

ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true);
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果命令超时字段从我的Web.config成功设置为60,为什么它会在30秒后超时?我可以尝试任何想法吗?

Nat*_*her 11

您可以将超时设置为hibernate.connection.connection_string属性的一部分.我没有使用Spring.Net所以我不确定它是如何设置NHibernate会话工厂的.如果能够将"连接超时= 120"添加到连接字符串.这应该会将默认的30秒超时时间增加到120秒.

以下行将在web.config:

<property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=; Connect Timeout=120;</property>
Run Code Online (Sandbox Code Playgroud)

编辑

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

上面显示了连接的一个,但是要使用NHibernate设置查询的超时,请使用该ICriteria接口.

ICriteria crit = session.CreateCriteria(typeof(Foo)); 
crit.SetTimeout(120); 
List<Foo> fooList = crit.List();
Run Code Online (Sandbox Code Playgroud)

超时值以秒为单位.

希望有所帮助

  • 有两种不同的超时:1)连接超时2)命令超时您建议更改第一个,但我需要设置第二个.阅读本文了解更多详情:http://tinyurl.com/ybpwkvl (6认同)