更改 NHibernate Session.Save 命令超时
Posted
技术标签:
【中文标题】更改 NHibernate Session.Save 命令超时【英文标题】:Changing NHibernate Session.Save command timeout 【发布时间】:2011-01-20 18:19:26 【问题描述】:我们有几个长时间运行的后端进程,它们的运行时间超过了默认的 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 秒后超时。
我构建了一个调用 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);
我的问题是:如果命令超时字段在我的 Web.config 中成功设置为 60,为什么它会在 30 秒后超时?我可以尝试任何想法吗?
【问题讨论】:
如果您发布一个重现该问题的小型示例应用程序将会很有帮助。编写那个小示例应用程序可能会让您清楚它为什么不工作。 好主意,但我已经这样做了。我构建了一个控制台应用程序来复制问题,但是控制台应用程序可以工作,而 Web 应用程序不能。 【参考方案1】:您可以将超时设置为 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();
超时值以秒为单位。
希望有帮助
【讨论】:
有两种不同的超时: 1) 连接超时 2) 命令超时 您建议更改第一个,但我需要设置第二个。阅读本文了解更多详情:tinyurl.com/ybpwkvl 您尝试过 ICriteria 接口上的 SetTimeout 吗?这可能是你真正追求的。 我不确定我是否可以访问 ICriteria。我正在尝试通过 HibernateTemplate 保存对象: HibernateTemplate.SaveOrUpdate(entity); HibernateTemplate.Flush(); 如果您有会话对象,那么您可以使用 Session.CreateCriteria 创建条件。我将编辑我的答案以进一步解释。 感谢 Nate 帮助我!如果我需要从数据存储中提取数据,您的代码示例将起作用,但是,当我尝试保存对象时出现超时:“HibernateTemplate.SaveOrUpdate(entity);”您如何设置 HibernateTemplate 的超时时间?以上是关于更改 NHibernate Session.Save 命令超时的主要内容,如果未能解决你的问题,请参考以下文章
更改 NHibernate Session.Save 命令超时
流畅的 NHibernate。更改级联选项时是不是需要重新创建数据库?