2011-10-10 111 views
2

我正在寻找在应用程序中使用Logback Classic DB Appender(ch.qos.logback.classic.db.DBAppender)。数据库是Sybase ASE。我使用c3p0连接池。logback dbappender性能

除了数据库appender,我也有一个滚动文件appender。问题是,在数据库Appender中,我看到性能急剧下降。例如,仅使用滚动文件appender,需要13 ms(毫秒)才能将消息记录到文件。但是,使用滚动文件appender和db appender时,需要4510 ms(4.5秒)才能将同一组消息输出到文件和数据库。

Logback DBAppender文档提到,使用c3p0连接池,插入单个日志记录语句大约需要1ms。我看到的数字比这个数字多出一千倍。不知道什么是错的。以下是我的logback.xml文件:

<configuration debug="true" scan="true"> 

    <property resource="log.properties" /> 

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
     <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${log.file.dir}/${project.artifactId}.log</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <!-- daily rollover --> 
      <fileNamePattern>${project.artifactId}.%d{yyyy-MM-dd}.log</fileNamePattern> 
      <!-- keep 30 days' worth of history --> 
      <maxHistory>${log.file.rolling.history.days}</maxHistory> 
     </rollingPolicy> 

     <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> 
     <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> 
      <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
       <driverClass>${log.db.driver}</driverClass> 
       <jdbcUrl>jdbc:sybase:Tds:${log.db.server}:${log.db.port}/${log.db.name}</jdbcUrl> 
       <serverName>${log.db.server}</serverName> 
       <databaseName>${log.db.name}</databaseName> 
       <user>${log.db.user}</user> 
       <password>${log.db.password}</password> 
      </dataSource> 
     </connectionSource> 
    </appender> 

    <root level="INFO"> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE" /> 
    </root> 

</configuration> 

任何指针赞赏。

谢谢。

+1

您可以创建一个参考测试用例,使用普通JDBC添加相同数量的数据,每个记录在单独的事务中?我不认为Logback会增加任何重要的开销,所以看看它可以直接完成的速度有多快会很有趣。 –

回答

1

我发现从的logback手册以下事项:如果你的JDBC驱动程序支持JDBC 3.0规范中引入了的getGeneratedKeys方法,假设你已经创建了相应的数据库表如上所述

,则不需要更多的步骤,除了用于通常的登录配置。

否则,必须有适合您的数据库系统的SQLDialect。目前,我们有PostgreSQL,MySQL,Oracle和MS SQL Server的方言。

对于Oracle来说,它说支持的版本是:(10.2.0.1)

链接: http://logback.qos.ch/manual/appenders.html#DBAppender

如果你没有在你的JDBC驱动程序方言类,可以从休眠搞定,把它放在你的源头,我不知道它是否可以工作。