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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top