动态设置Tomcat Pool属性

时间:2017-01-06 04:30:41

标签: spring tomcat spring-boot datasource

我们有一个包含多个数据源的多租户应用程序,并希望为每个数据源单独配置数据池属性(maxActive,minIdle等)。

目前,我正在构建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 setters调用来设置值。

那么有没有办法从字符串动态设置这些属性而不调用每个单独的setter?

当我设置setConnectionPropertiessetDbProperties的用户名时,它确实发生了变化,但我认为这可能是特定于用户名和密码之类的东西,因为我尝试设置的其他属性没有&# 39;没有效果。

编辑:为了澄清,数据源属性将从数据库加载,并且可以动态添加新的数据源,因此使用应用程序属性将无法正常工作。

2 个答案:

答案 0 :(得分:0)

我假设您正在开发spring-boot项目。在这种情况下,

在spring-boot的application.properties文件中创建属性

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

并创建一个配置文件来创建数据源,如下所示

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

像这样,您可以创建具有不同名称的多个属性,并在创建不同的数据源Bean时引用它。

如果需要,可以将application.properties文件放在项目之外,并使用主类中的 @PropertySource 注释来访问它。

答案 1 :(得分: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中设置和版本化)可能有所帮助。