2016-09-11 86 views
1

Log4j2 JDBC附加器可以使用利用電話和方法定義的池連接工廠進行設置(見log4j2 Appenders):log4j2 JDBC附加器與彈簧

<ConnectionFactory class="net.example.db.ConnectionFactory" method="getDatabaseConnection" /> 

使用Spring我已經被提供了一個定義數據源池連接:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${db_driver_class}" /> 
    <property name="url" value="${db_jdbc_url}" /> 
    <property name="username" value="${db_username}" /> 
    <property name="password" value="${db_password}" /> 
    <property name="initialSize" value="10" /> 
    <property name="maxActive" value="100" /> 
    <property name="maxIdle" value="50" /> 
    <property name="minIdle" value="10" /> 
    <property name="validationQuery" value="select 1" /> 
    <property name="testOnBorrow" value="true" /> 

我想爲JDBC appender使用Spring連接池。任何想法如何做到這一點?

感謝

拉茲

回答

1

我奶源創建3-步驟溶液:

  1. 定義在彈簧上下文中的豆,可以用於訪問數據 源
  2. 構建一個實施提供所需連接的bean。
  3. 構建可以由log4j JDBC appender訪問的靜態包裝器。

第一步 - Bean聲明:

<bean id="springConnection" class="com.dal.entities.SpringConnection" scope="singleton"> 
    <property name="dataSource" ref="myDataSource" /> 

第2步 - bean的實現 - 也很簡單:

class SpringConnection { 

private DataSource dataSource; 

public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
} 

Connection getConnection() throws Exception { 
    return dataSource.getConnection(); 
} 

}

第三部分 - 包裝與靜態方法 - 有點更多co mplex:

public class SpringAccessFactory { 

private final SpringConnection springCon; 
private static ApplicationContext context; 

private interface Singleton { 
    final SpringAccessFactory INSTANCE = new SpringAccessFactory(); 
} 

private SpringAccessFactory() { 

    this.springCon = context.getBean(SpringConnection.class); 
} 

public static Connection getConnection() throws Exception { 
    return Singleton.INSTANCE.springCon.getConnection(); 
} 

public static void setContext(ApplicationContext context) { 
    SpringAccessFactory.context = context; 
} 

}

有 - 然而 - 2個問題,我發現迄今:

  • 需要初始化Spring上下文,並將其發送到包裝(SpringAccessFactory.setConetxt)在你開始使用記錄器之前,在你打算這麼做之前,初始化程序的初始化spring context可能會觸發@PostConstruct方法(如果存在的話)。