簡體   English   中英

在 Spring Boot 中以編程方式配置 DataSource

[英]Configure DataSource programmatically in Spring Boot

使用 Spring Boot,我可以使用以下內容實例化JdbcTemplate

代碼:

@Autowired
private JdbcTemplate jdbcTemplate;

特性:

spring.datasource.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.datasource.username=my_user_name
spring.datasource.password=my_password
spring.datasource.driver-class-name=org.postgresql.Driver

這將創建一個類的數據源: org.apache.tomcat.jdbc.pool.DataSource

如何以編程方式設置數據源用戶名/密碼?

我們有一項政策,不以純文本形式存儲憑據,我必須使用我工作的特定憑據提供程序。

如果您使用jdbc starter,則可以使用DataSourceBuilder 此外,為了覆蓋默認的自動配置 bean,您需要將 bean 標記為@Primary

就我而言,我有以datasource.postgres前綴開頭的屬性。

例如

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

如果這對您來說不可行,那么您可以使用

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

根據您的幫助,我的spring-boot項目運行正常。 yaml 數據源配置為:

spring:
  # (DataSourceAutoConfiguration & DataSourceProperties)
  datasource:
    name: ds-h2
    url: jdbc:h2:D:/work/workspace/fdata;DATABASE_TO_UPPER=false
    username: h2
    password: h2
    driver-class: org.h2.Driver

自定義數據源

@Configuration
@Component
public class DataSourceBean {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    @Primary
    public DataSource getDataSource() {
        return DataSourceBuilder
                .create()
//                .url("jdbc:h2:D:/work/workspace/fork/gs-serving-web-content/initial/data/fdata;DATABASE_TO_UPPER=false")
//                .username("h2")
//                .password("h2")
//                .driverClassName("org.h2.Driver")
                .build();
    }
}

您需要做的就是用@Bean 注釋一個返回數據源的方法。 下面是一個完整的工作示例。

@Bean
public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url(dbUrl);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();   
}

如果您使用的是最新的 Spring Boot(使用 jdbc starter 和 Hikari),您會​​遇到: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. 要解決這個問題:

  1. 在您的 application.properties 中:

datasource.oracle.url=youroracleurl

  1. 在您的應用程序中定義為 bean( @Primary是必需的! ):
@Bean
@Primary
@ConfigurationProperties("datasource.oracle")
public DataSourceProperties getDatasourceProperties() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("datasource.oracle")
public DataSource getDatasource() {
    return getDatasourceProperties().initializeDataSourceBuilder()
           .username("username")
           .password("password")
           .build();
}

如果你想要更多的日期源配置,例如

spring.datasource.test-while-idle=true 
spring.datasource.time-between-eviction-runs-millis=30000
spring.datasource.validation-query=select 1

你可以使用下面的代碼

@Bean
public DataSource dataSource() {
    DataSource dataSource = new DataSource(); // org.apache.tomcat.jdbc.pool.DataSource;
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setTestWhileIdle(testWhileIdle);     
    dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMills);
    dataSource.setValidationQuery(validationQuery);
    return dataSource;
}

參考: Spring 啟動 jdbc 連接

作為替代方法,您可以使用 DriverManagerDataSource 例如:

public DataSource getDataSource(DBInfo db) {

    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setUsername(db.getUsername());
    dataSource.setPassword(db.getPassword());
    dataSource.setUrl(db.getUrl());
    dataSource.setDriverClassName(db.getDriverClassName());

    return dataSource;
}

但是要小心使用它,因為:

注意:這個類不是一個實際的連接池; 它實際上並不池連接。 它只是作為成熟連接池的簡單替代品,實現相同的標准接口,但在每次調用時創建新的連接。 參考

對於使用 url 的 springboot 2.1.7 似乎不起作用。 改為使用 jdbcUrl 更改。

在屬性中:

security:
      datasource:
        jdbcUrl: jdbc:mysql://ip:3306/security
        username: user
        password: pass

在Java中:

@ConfigurationProperties(prefix = "security.datasource")
@Bean("dataSource")
@Primary
public DataSource dataSource(){

    return DataSourceBuilder
            .create()
            .build();
}

我在Spring-Boot 2 中自定義了Tomcat DataSource

依賴版本:

  • 彈簧靴:2.1.9.RELEASE
  • tomcat-jdbc:9.0.20

可能對某人有用。

應用程序.yml

spring:
    datasource:
        driver-class-name: org.postgresql.Driver
        type: org.apache.tomcat.jdbc.pool.DataSource
        url: jdbc:postgresql://${spring.datasource.database.host}:${spring.datasource.database.port}/${spring.datasource.database.name}
        database:
            host: localhost
            port: 5432
            name: rostelecom
        username: postgres
        password: postgres
        tomcat:
            validation-query: SELECT 1
            validation-interval: 30000           
            test-on-borrow: true
            remove-abandoned: true
            remove-abandoned-timeout: 480
            test-while-idle: true
            time-between-eviction-runs-millis: 60000
            log-validation-errors: true
            log-abandoned: true

爪哇

@Bean
@Primary
@ConfigurationProperties("spring.datasource.tomcat")
public PoolConfiguration postgresDataSourceProperties() {
    return new PoolProperties();
}

@Bean(name = "primaryDataSource")
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource primaryDataSource() {
    PoolConfiguration properties = postgresDataSourceProperties();
    return new DataSource(properties);
}

這樣做的主要原因是應用程序中有幾個 DataSources,其中一個需要標記為@Primary

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM