2013-10-18 15 views
5

Ho una webapp che utilizza Primavera per impostare una DataSource alla connessione in pool in questo modo:Utilizzando il DataSource primavera in un DBAppender logback

<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}" /> 

L'applicazione utilizza anche logback per la registrazione degli eventi direttamente al database. Logback è configurato in un file con un logback.xml DBAppender:

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

Come potete vedere stiamo impostare il DataSource per due volte, e che richiedono sostituzioni di proprietà separati in ogni caso. Sarebbe molto meglio semplicemente lasciare che Spring crea il dataSource e lo trasmette al logback DBAppender.

Qualcuno può suggerire il modo migliore per farlo?

risposta

0

Una possibilità è quella di configurare a livello di codice come un fagiolo:

@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; 
} 

Questo naturalmente significa che non registrerà eventi che si sono verificati prima di questo fagiolo è stato creato.

Problemi correlati