2013-10-18 84 views
5

使用Spring數據源我有一個使用Spring來建立一個連接池化的數據源,像這樣一個Web應用程序:中的logback DBAppender

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="${jdbc.driverClassName}" /> 
    <property name="jdbcUrl" value="${jdbc.url}" /> 
    <property name="user" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 

該應用程序還使用記錄的logback事件直接到數據庫中。的logback配置與DBAppender一個logback.xml文件:

<appender name="eventsDB" class="ch.qos.logback.classic.db.DBAppender"> 
    <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> 
     <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <driverClass>${jdbc.driverClassName}</driverClass> 
     <jdbcUrl>${jdbc.url}</jdbcUrl> 
     <user>${jdbc.username}</user> 
     <password>${jdbc.password}</password> 
     </dataSource> 
    </connectionSource> 
    </appender> 

正如你可以看到我們在建立數據源的兩倍,並要求在每種情況下單獨的屬性替代。簡單地讓Spring創建dataSource並將其傳遞給logback DBAppender會好得多。

任何人都可以建議最好的方法來做到這一點?

回答

0

一種選擇是通過編程將其配置爲一個bean:這當然

@Bean 
public DBAppender dbAppender(DataSource dataSource){ 
    DBAppender dbAppender = new DBAppender(); 
    DataSourceConnectionSource connectionSource = new DataSourceConnectionSource(); 
    connectionSource.setDataSource(dataSource); 
    connectionSource.start(); 
    dbAppender.setConnectionSource(connectionSource); 
    dbAppender.start(); 

    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
    Logger logger = loggerContext.getLogger("ROOT"); 
    logger.addAppender(dbAppender); 

    return dbAppender; 
} 

意味着它將無法登錄創建這個bean之前即發生任何事件。