2012-02-21 19 views
5

He configurado NHibernate para dar salida a sus sentencias SQL a la ventana de Visual Studio de salida usando el siguiente código de configuración:¿nHibernate ShowSql tendrá algún efecto en un sistema en vivo?

var configuration = Fluently.Configure(cfg) 
       .Database(
        MsSqlConfiguration.MsSql2005 
        .ConnectionString(connectionString) 
        .DefaultSchema("dbo") 
        .UseReflectionOptimizer() 
        .AdoNetBatchSize(32) 
        .ShowSql() 

y en mi Web.config:

<appender name="NHibernateFileLog" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 

<logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG"/> 
    <appender-ref ref="NHibernateFileLog"/> 
</logger> 

tendrá esto cualquier actuación impacto en el sistema en vivo? El nivel de registro en el sistema en vivo es ERROR, así que supongo que eso significa que el registrador no se encenderá, pero ¿seguirá agotándose la configuración de ShowSql en mi nHibernate?

Respuesta

4

El registro tiene un impacto significativo en su rendimiento, sin embargo, cuánto debe probar en su entorno de producción/prueba. Al usar ShowSql(), enviará el SQL a su registrador, que lo filtrará. Normalmente, debe configurar el indicador ShowSql en su configuración. En ese caso se puede establecer en false en su entorno de producción:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
     <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 
     <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
     <property name="connection.connection_string"> 
Server=(local);Database=NHibernateFAQ;Integrated Security=SSPI; 
     </property> 
<property name="show_sql">false</property> 
    </session-factory> 
</hibernate-configuration> 

configure-log4net-for-use-with-nhibernate

+0

Gracias, eso tiene mucho sentido. Nuestro sistema usa una configuración fluida, así que he decidido agregar un # if DEPURACIÓN para determinar si agregar el .ShowSql. No puedo pensar en una forma más elegante de hacerlo. – kasey

+1

la respuesta de cremor es correcta: show_sql solo inicia sesión en stdout, no es la forma de registro. –

+0

Además, escribir en stdout en una aplicación de subprocesos múltiples puede crear problemas de condición de carrera: http://stackoverflow.com/questions/12638810/nhibernate-race-condition-when-loading-entity – Vitaliy

3

ShowSql() sólo es necesario si desea que su SQL da salida a la consola sin tener que configurar log4net. No necesita (y no debe usar) ShowSql() si tiene un registrador configurado para "NHibernate.SQL".

PD: Recomiendo agregar FormatSql() en un #if DEBUG para generar SQL legible durante la depuración.

PS2: ¿Por qué su TraceAppender tiene el nombre "NHibernate * , archivo * Log"? ;-)

+0

¡Gracias! Primero estaba registrando para archivar y luego decidí iniciar sesión en la consola, por lo que no me di cuenta de que la configuración original ya no era necesaria. – kasey

0

Mi rendimiento de la aplicación se ralentizó en más de 10 veces con la configuración de registro predeterminada con .ShowSql() activado. Así que tenlo en cuenta.

También con fluidez nhibernate admite configuraciones desde el archivo de configuración - en mi caso #if DEBUG no fue una solución, ya que .ShowSql() disminuye la velocidad de trabajo con la aplicación durante la prueba, así que decidí mantenerlo a menos que lo necesite.

Cuestiones relacionadas