.net nHibernate ShowSql会对实时系统产生任何影响吗?

.net nHibernate ShowSql会对实时系统产生任何影响吗?,.net,nhibernate,logging,configuration,log4net,.net,Nhibernate,Logging,Configuration,Log4net,我已使用以下配置代码将nHibernate配置为将其SQL语句输出到Visual Studio输出窗口: var configuration = Fluently.Configure(cfg) .Database( MsSqlConfiguration.MsSql2005 .ConnectionString(connectionString) .

我已使用以下配置代码将nHibernate配置为将其SQL语句输出到Visual Studio输出窗口:

var configuration = Fluently.Configure(cfg)
                .Database(
                    MsSqlConfiguration.MsSql2005
                    .ConnectionString(connectionString)
                    .DefaultSchema("dbo")
                    .UseReflectionOptimizer()
                    .AdoNetBatchSize(32)
                    .ShowSql()
在my 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>


这会对实时系统的性能产生影响吗?实时系统上的日志级别是错误的,所以我猜这意味着记录器不会打开,但我的nHibernate配置上的ShowSql是否仍会使用资源

日志记录对您的性能有很大影响,但是您应该在生产/测试环境中测试多少。使用ShowSql()时,它会将SQL发送到记录器,记录器会对其进行过滤。通常,您会在配置中配置ShowSql标志。在这种情况下,您可以在生产环境中将其设置为false:

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

NHibernate.Connection.DriverConnectionProvider
NHibernate.dialogue.mssql2005dialogue
NHibernate.Driver.SqlClientDriver
服务器=(本地);数据库=NHibernateFAQ;综合安全=SSPI;
假的

ShowSql()
仅当您希望在不配置log4net的情况下将SQL输出到控制台时才需要。如果为“NHibernate.SQL”配置了记录器,则不需要(也不应该使用)
ShowSql()

PS:我建议在
#if DEBUG
中添加
FormatSql()
,以便在调试时生成可读的SQL


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

在启用
.ShowSql()
的情况下,使用默认日志记录配置,我的应用程序性能降低了10倍多。所以要意识到这一点


此外,fluent nhibernate还支持配置文件中的configuratin—在我的例子中,如果调试不是一个解决方案,因为
.ShowSql()
会在测试时减慢应用程序的运行速度,因此我决定在需要时关闭它。

谢谢,这很有意义。我们的系统使用fluent配置,因此我决定添加一个#if调试来确定是否添加.ShowSql。想不出更优雅的方法。cremor的答案是正确的:show_sql只需登录到标准输出,这不是日志记录方式。此外,在多线程应用程序中写入标准输出可能会造成竞争条件问题:谢谢!我先登录到文件,然后决定登录到控制台,所以一定没有意识到不再需要原始配置。