excepción de tiempo de espera cuando el tiempo de espera conjunto a tiempo infinito
-
27-09-2019 - |
Pregunta
En mi C # .NET 3.5 aplicación que estoy utilizando CastleProject ActiveRecord sobre NHibernate. Esta es una aplicación de escritorio utilizando MS SQL Server 2008. Tengo conjunto de tiempo de espera de comando ADO a 0 para evitar la excepción de tiempo de espera durante las operaciones a granel:
<activerecord>
<config>
...
<add key="hibernate.command_timeout" value="0" />
</config>
</activerecord>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
...
<property name="command_timeout">0</property>
</session-factory>
</hibernate-configuration>
Sin embargo, todavía estoy recibiendo excepción de tiempo de espera! El registro muestra NHibernate algo como esto:
En algún lugar al comienzo:
2010-10-02 06: 29: 47,746 INFO NHibernate.Driver.DriverBase - el establecimiento de tiempo de espera de comando de ADO.NET en 0 segundos
En algún lugar al final:
2010-10-02 07: 36: 03 020 DEBUG NHibernate.AdoNet.AbstractBatcher - IDbCommand cerrado, IDbCommand abierta es: 0 2010-10-02 07: 36: 03 382 ERROR NHibernate.Event.Default.AbstractFlushingEventListener - No se pudo syn estado de la base de datos con la sesión chronize NHibernate.HibernateException: Un Excepción al ejecutar Consultas por lotes: ---> System.Data.S qlClient.SqlException: Tiempo de espera Caducado. El período de tiempo de espera transcurrido antes de la finalización de la ópera ción o el servidor no está respondiendo. a System.Data.SqlClient.SqlConnection.OnError (SqlException excepción, Boolean breakConnection)
¿Por qué? Cómo solucionar este problema?
Solución
Es correcto que un valor de 0 indica que no hay tiempo de espera (como definido en la documentación de MSDN ), sin embargo, mientras conductor de NHibernate pasa el valor de configuración para el comando db cuando es> = 0 , la condición del dosificador comprueba que el valor es> 0 .
Por lo tanto, cuando se establece el procesamiento por lotes, con un valor de tiempo de 0, el valor no se trasladará al comando db por lo que permanece como predeterminada.
Es muy posible que esto es por diseño, y los desarrolladores que NHibernate deshabilitado intencionadamente desactivación de los tiempos de espera para los escenarios por lotes. Desactivación de tiempo de espera es una mala idea de todos modos, si usted tiene problemas con los errores de tiempo de espera me gustaría elevar el valor, pero no lo inhabilita.
Por favor confirmar esto con los desarrolladores de NHibernate.
Otros consejos
podría estar buscando para establecer el tiempo de espera para las consultas específicas y no a nivel web.config (lo contrario que realmente necesita para poner a punto su aplicación :)).
Recientemente he encontrado esta respuesta que me ayudó:
Cómo establecer Nhibernate LINQ límite de comando usando Sesión .query