2010-02-24 123 views
12

我們有一些長時間運行的後端進程需要比默認的30秒更長的時間。更改NHibernate Session.Save命令超時

我們的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> 

要解決這個問題,我想NHibernate的command_timeout設置爲60在Web.config。 這是Web.config文件:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="command_timeout">60</property> 
    </session-factory> 
</hibernate-configuration> 

不幸的是,這並不工作,命令超時30秒後。

我構建了一個調用DAO的控制檯應用程序,就像web應用程序一樣。我的配置文件中有完全相同的NHibernate配置設置。 IDbCommand在60秒後超時,而不是30,使用配置文件中的設置成功。

我試着調試應用程序,並檢查從網站調用DAO程序集時是否設置了commandTimeout。它是。

這是從Visual Studio手錶:

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

該會話這樣創建的:

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

我的問題是:如果命令超時字段已成功設置爲60從我的Web.config,它爲什麼超時30秒後?我可以嘗試的任何想法?

+0

如果您發佈了一個能夠重現問題的小示例應用程序,這將會很有幫助。編寫這個小示例應用程序可能會告訴你爲什麼它不起作用。 – 2010-02-25 10:14:01

+0

好主意,但我已經做到了。我構建了一個控制檯應用程序來複制問題,但控制檯應用程序可以正常工作,而Web應用程序則不能。 – adomokos 2010-03-02 15:53:48

回答

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> 

編輯

事實證明,實際上有兩個超時。感謝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 2010-02-25 16:44:55

+0

Doh ..你是對的。我選錯了一個 – 2010-02-26 21:49:04

+0

你有沒有在ICriteria接口上試過SetTimeout?這可能是你實際上在做什麼。 – 2010-02-26 21:50:40