今天我遇到了超时问题。
我有以下配置用于创建SessionFactory:
<property name="adonet.batch_size">50</property>
<property name="command_timeout">600</property>
我没有将它存储在web中。配置,但在XML文件中手动传递给配置:
configuration.Configure(cfgFile)
因此,我可以有多个会话工厂(每个数据库)独立配置。
但是command_timeout
似乎只有在NHibernate不使用批处理时才有效。如果SQL命令是批处理的,那么对于一些大批量的SQL命令,我得到:
NHibernate.Exceptions.GenericADOException: could not execute batch command.
[SQL: SQL not available] --->
System.Data.SqlClient.SqlException: Timeout expired.
The timeout period elapsed prior to completion of the operation or the server is not responding.
在谷歌搜索解决方案时,我发现了一篇解释为什么会发生这种情况的文章:http://ronaldrosiernet.azurewebsites.net/Blog/2013/04/20/timeout_in_nhibernate_batched_sessions
问题的原因是,对于SQL批处理NHibernate使用Cfg.Environment.CommandTimeout,而不是在创建会话时传递给配置的command_timeout
。
在创建配置时,我找到了一种实现变通的方法:
if (configuration.Properties.ContainsKey(NHibernate.Cfg.Environment.CommandTimeout))
NHibernate.Cfg.Environment.Properties[NHibernate.Cfg.Environment.CommandTimeout] =
configuration.Properties[NHibernate.Cfg.Environment.CommandTimeout];
,现在我的同事说超时现在似乎是固定的。
但是让我困惑的是下面的线程:https://forum.hibernate.org/viewtopic.php?f=25& t = 983105
说:
属性NHibernate.Cfg.Environment.Properties返回一个副本的全局属性,因此不能修改它。
如果NHibernate.Cfg.Environment.Properties是只读副本,那么为什么我的解决方案似乎工作得很好?它是稳定的,还是这个修复不可靠,在其他情况下可能会中断?
我还在NHibernate JIRA中发现了一个相关的问题:https://nhibernate.jira.com/browse/nh - 2153
如果他们说他们修复了v3.1.0中的command_timeout问题。那么为什么我仍然要在NHibernate v3.3.2中使用我的解决方案。
?有人对此有什么见解吗?
我在使用批量时也有同样的问题。hibernate类SqlClientBatchingBatcher使用命令超时从环境。GlobalProperties是只读的。我发现只有两种方法可以在SqlClientBatchingBatcher上设置超时。currentBatch命令
在app.config文件
中使用timeout<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="command_timeout">120</property>
</session-factory>
</hibernate-configuration>
2) set Environment.
FieldInfo field = typeof(global::NHibernate.Cfg.Environment).GetField("GlobalProperties", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
Dictionary<string, string> gloablProperties = field.GetValue(null) as Dictionary<string, string>;
gloablProperties.Add("command_timeout","120");