以编程方式设置SpringBoot数据源

时间:2018-02-07 08:05:52

标签: spring-boot spring-data mariadb

我需要为SpringBoot应用程序设置两个数据源。目前,在MariaDB服务器上处理(成功)超时的单个Datasource工作解决方案在application.properties中设置了以下三个参数

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.validationQuery = SELECT 1

我使用基于Java的数据源配置检查的各种示例通常如下:

    @Primary
    @Bean
    public DataSource userDataSource() {

        DriverManagerDataSource dataSource
          = new DriverManagerDataSource();
        dataSource.setDriverClassName(
          env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("user.jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));

        return dataSource;
    }

问题是我不知道如何使用Datasource类设置testWhileIdle和validationQuery,因为没有相应的方法,我在MariaDB文档中没有看到任何可以作为JDBC URL的一部分传递的相关选项

2 个答案:

答案 0 :(得分:1)

如果您在Tomcat中使用Spring Boot,那么它将使用org.apache.commons.dbcp.BasicDataSource而不是DriverManagerDataSource。更改您的dataSource方法以返回BasicDataSource,其中包含设置testWhileIdlevalidationQuery的方法。

@Primary
@Bean
public DataSource userDataSource() {

    BasicDataSource dataSource
      = new BasicDataSource();
    dataSource.setDriverClassName(
      env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("user.jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    dataSource.setTestWhileIdle(env.getProperty("jdbc.testWhileIdle"));
    dataSource.setValidationQuery(env.getProperty("jdbc.validationQuery"));


    return dataSource;
}

答案 1 :(得分:1)

...
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
...

@Primary
@Bean
public DataSource dataSource() {
    DataSourceBuilder factory = DataSourceBuilder
                .create()
                .url(...)
                .username(...)
                .password(...)
                .driverClassName(...);
        return factory.build();
}
...