2010-02-24 17 views
12

Tenemos un par de procesos de administración de larga ejecución que toman más tiempo que los 30 segundos predeterminados.Cambio de la sesión de NHibernate. Ahorro de tiempo de espera del comando

Nuestra versión NHibernate es 2.0.1.4000 y Spring.NET es 1.2.0.20313. NHibernate se configura a través Spring.NET esta manera:

<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> 

Para evitar esto, yo estoy tratando de establecer el command_timeout NHibernate a 60 en el Web.config. Esto es de Web.config:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="command_timeout">60</property> 
    </session-factory> 
</hibernate-configuration> 

Desafortunadamente esto no funciona, los tiempos de mando después de 30 segundos.

Creé una aplicación de consola que llama a DAO al igual que lo hace la aplicación web. Tengo exactamente la misma configuración de NHibernate en su archivo de configuración. El IDbCommand supera el tiempo de espera después de 60 segundos y no 30, utilizando la configuración con éxito desde el archivo de configuración.

He intentado depurar la aplicación y comprobar si el comandoTimeout se estableció cuando se llama al ensamblado DAO desde el sitio web. Era.

Esto es de Estudio reloj visual:

((NHibernate.Driver.DriverBase) (((NHibernate.Connection.DriverConnectionProvider) ((NHibernate.Impl.SessionFactoryImpl) session.SessionFactory) .ConnectionProvider) .Driver)) CommandTimeOut:. 60

La sesión se crea de esta manera:

ISession session = SessionFactoryUtils.GetSession(HibernateTemplate.SessionFactory, true); 

Mi pregunta es: si el campo de tiempo de espera del comando se estableció con éxito en 60 de mi Web.config, ¿por qué transcurre el tiempo de espera después de 30 segundos? ¿Alguna idea que pueda probar?

+0

Sería útil si publicó una pequeña aplicación de muestra que reprodujo el problema. Escribir esa pequeña aplicación de muestra puede aclararle por qué no está funcionando. –

+0

Gran idea, pero ya lo hice. Creé una aplicación de consola para replicar el problema, pero la aplicación de consola funciona y la aplicación web no. – adomokos

Respuesta

11

Puede establecer el tiempo de espera como parte de la propiedad hibernate.connection.connection_string. No he usado Spring.Net, así que no estoy seguro de cómo se configura la fábrica de sesiones de NHibernate. Si puede agregar "Tiempo de espera de conexión = 120" a la cadena de conexión. Esto debería aumentar el tiempo del tiempo de espera predeterminado de 30 segundos a 120 segundos.

La siguiente línea iría en el web.config:

<property name="connection.connection_string">Server=localhost;initial catalog=nhibernate;User Id=;Password=; Connect Timeout=120;</property> 

EDITAR

Resulta que en realidad hay dos tiempos de espera. Gracias a adomokos por señalar eso. Uno para la apertura real de la conexión y otro para las consultas que se ejecutan.

El de la conexión se muestra arriba, sin embargo, para configurar el tiempo de espera para una consulta con NHibernate, utiliza la interfaz ICriteria.

ICriteria crit = session.CreateCriteria(typeof(Foo)); 
crit.SetTimeout(120); 
List<Foo> fooList = crit.List(); 

El valor de tiempo de espera es en segundos.

Espero que ayude

+6

Hay dos tiempos de espera diferentes: 1) Tiempo de espera de conexión 2) Tiempo de espera de comandos Usted está sugiriendo cambiar el primero uno, pero tiene que establecer el segundo. Lea esto para obtener más detalles: http://tinyurl.com/ybpwkvl – adomokos

+0

Doh ... Tiene razón. Escogí el equivocado –

+0

¿Has probado el SetTimeout en la interfaz de ICriteria? que es probablemente lo que realmente buscas. –

Cuestiones relacionadas