2012-02-21 87 views
5

我已经配置了NHibernate的输出它的SQL语句使用下面的配置代码在Visual Studio输出窗口:nHibernate ShowSql会对现场系统产生什么影响吗?

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

和我的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> 

这会不会有什么表现对现场系统的影响?实时系统上的日志级别为ERROR,所以我想这意味着日志记录程序不会打开,但是我的nHibernate配置中的ShowSql是否仍会占用资源?

回答

4

日志记录对您的性能有重大影响,但是您应该在生产/测试环境中测试多少。当使用ShowSql()时,它会将SQL发送到记录器,该记录器将过滤它。通常你会在你的配置中配置ShowSql标志。如果你希望你的SQL输出到控制台,而无需配置log4net的

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

谢谢,这很有道理。我们的系统使用流利的配置,所以我决定添加一个#if DEBUG来决定是否添加.ShowSql。想不到更优雅的做法。 – kasey 2012-02-21 10:45:41

+1

cremor答案是正确的:show_sql只是登录到stdout,它不是记录器的方式。 – 2012-02-21 14:13:37

+0

此外,写入多线程应用程序中的stdout可能会产生竞争条件问题:http://stackoverflow.com/questions/12638810/nhibernate-race-condition-when-loading-entity – Vitaliy 2015-12-24 12:16:59

3

ShowSql()只需要:在这种情况下,你可以将它设置为false,在生产环境中。如果您为“NHibernate.SQL”配置了记录器,则不需要(也不应该使用)ShowSql()。 PS:我建议在#if DEBUG中添加FormatSql()以在调试时生成可读的SQL。

PS2:为什么您的TraceAppender名为“NHibernate * 文件 * Log”? ;-)

+0

谢谢!我首先登录到文件,然后决定登录到控制台,因此一定不会意识到不再需要原始配置。 – kasey 2012-02-29 16:46:30

0

我的应用程序性能在使用默认日志记录配置的情况下减慢了10倍以上,启用了.ShowSql()。所以要注意它。

而且功能NHibernate支持从配置文件configuratin - 在我的情况#if DEBUG不是一个解决方案,因为.ShowSql()减慢与应用工作,同时测试,所以我决定把它关闭,除非我需要它。

相关问题