2017-01-06 55 views
0

我們有一個多租戶應用程序,它具有多個數據源,並且要爲每個數據源單獨配置數據池屬性(maxActive,minIdle等)。動態設置Tomcat池屬性

目前我正在構建一個org.apache.tomcat.jdbc.pool.DataSource並手動設置一些屬性,如用戶名和密碼dataSource.setUserName()dataSource.setPassword()。我想通過從字符串加載配置來設置其餘屬性,例如minIdle=20;initialSize=15

DataSource上有兩種方法看起來像他們會做到這一點,但似乎沒有做我所期望的。我嘗試了dataSource.setConnectionProperties("..")以及一些屬性,並填充了一個Properties對象並將它傳遞給dataSource.setDbProperties(),但是當我通過JMX查看池屬性時似乎沒有任何效果。我只能通過諸如dataSource.setInitialSize()這樣的特定設置器來改變這些屬性。

我可以想到,在沒有上述嘗試的情況下設置每個屬性的唯一方法是遍歷每個屬性,並通過if-else或switch-case邏輯來確定哪些屬性dataSource設置器調用來設置值。

那麼有沒有辦法從一個字符串動態設置這些屬性,而無需調用每個單獨的setter?

當我設置的用戶名任一setConnectionPropertiessetDbProperties,它的確發生了變化,但我想這可能是具體的東西像用戶名和密碼,我試圖設置沒有效果的其他屬性。

編輯:爲了澄清,數據源屬性將從數據庫中加載,並且可以即時添加新的數據源,因此使用應用程序屬性將不起作用。

回答

0

我假設你正在開發spring-boot項目。在這種情況下,

創建春季啓動

spring.datasource.username=XXX 
spring.datasource.password=XXX 
spring.datasource.max-active=XXX 
spring.datasource.min-idle=XXX 

的application.properties文件屬性,並創建一個配置文件來創建數據源如下圖所示

@Configuration 
public class DataSourceConfiguration { 

    @Value("${spring.datasource.url}") 
    private String url; 
    @Value("${spring.datasource.driverClassName}") 
    private String driverClass; 
    @Value("${spring.datasource.username}") 
    private String username; 
    @Value("${spring.datasource.password}") 
    private String password; 
    @Value("${spring.datasource.min-idle}") 
    private Long minIdle; 

    @Bean 
    @Primary 
    public DataSource dataSource() { 
     DataSource dataSource = new DataSource(); 
     dataSource.setJdbcUrl(url); 
     dataSource.setDriverClassName(driverClass); 
     dataSource.setUsername(username); 
     dataSource.setPassword(password); 
     dataSource.setMinimumIdle(minIdle); 
     return dataSource; 
    } 
} 

這樣,你可以創建具有不同名稱的多個屬性,並在創建不同的數據源Beans時引用它。

如果需要,可以將application.properties文件放置在項目之外,並在您的主類中使用@PropertySource批註進行訪問。

0

我會使用Spring Boot ConfigurationProperties支持。從手冊:

74.2配置兩個數據源 創建多個數據源與創建第一個數據源的工作方式相同。如果您使用的是JDBC或JPA的默認自動配置(那麼將通過任何@Autowired注入來獲取該配置),您可能希望將其中一個標記爲@Primary。

@Bean 
@Primary 
@ConfigurationProperties(prefix="datasource.primary") 
public DataSource primaryDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

@Bean 
@ConfigurationProperties(prefix="datasource.secondary") 
public DataSource secondaryDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

如果你擔心其在性質相似的性質的負載文件,Spring配置服務器(這使它們能夠建立和GIT版本)可能的幫助。