2010-02-24 125 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