2012-02-21 16 views
5

Ho configurato NHibernate per emettere le sue istruzioni SQL per la finestra di Visual Studio di output utilizzando il seguente codice di configurazione:WillHibernate ShowSql ha qualche effetto su un sistema live?

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

e nel mio 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> 

avrà questo ogni performance impatto sul sistema live? Il livello di log sul sistema live è ERROR, quindi suppongo che ciò significhi che il logger non sarà acceso, ma lo ShowSql nella mia configurazione di NHibernate utilizzerà ancora risorse?

risposta

4

La registrazione ha un impatto significativo sulle prestazioni, tuttavia quanto è necessario eseguire il test nell'ambiente di produzione/test. Quando usi ShowSql(), invierà l'SQL al tuo logger, che lo filtrerà. Normalmente dovresti configurare il flag ShowSql nella tua configurazione. In questo caso è possibile impostare a false nell'ambiente di produzione:

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

Grazie, ha molto senso. Il nostro sistema utilizza una configurazione fluente, quindi ho deciso di aggiungere un # DEBUG #if per determinare se aggiungere .ShowSql. Non riesco a pensare a un modo più elegante di farlo. – kasey

+1

la risposta del cremore è corretta: show_sql è sufficiente accedere allo stdout, non è la modalità di registrazione. –

+0

Inoltre, la scrittura su stdout in un'applicazione multi-thread può creare problemi di race condition: http://stackoverflow.com/questions/12638810/nhibernate-race-condition-when-loading-entity – Vitaliy

3

ShowSql() è necessaria solo se si desidera che lo SQL emesso alla console senza configurare log4net. Non hai bisogno (e non dovresti usare) ShowSql() se hai un logger configurato per "NHibernate.SQL".

PS: mi consiglia di aggiungere FormatSql() in un #if DEBUG per generare SQL leggibile durante il debug.

PS2: perché il tuo TraceAppender è denominato "NHibernate * File * Log"? ;-)

+0

Grazie! Stavo registrando prima il file e poi ho deciso di accedere alla console, quindi non ho capito che la configurazione originale non era più necessaria. – kasey

0

Ho rallentato le prestazioni dell'applicazione in più di 10 volte utilizzando la configurazione di registrazione predefinita con .ShowSql() attivato. Quindi sii consapevole di ciò.

Anche il NIBernate fluente supporta la configurazione dal file di configurazione - nel mio caso #if DEBUG non era una soluzione, poiché .ShowSql() rallenta il funzionamento dell'applicazione durante i test, quindi ho deciso di tenerlo spento a meno che non ne avessi bisogno.

Problemi correlati