web-dev-qa-db-ja.com

Spring Bootでプログラム的にDataSourceを構成する

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

DataSourceのユーザー名/パスワードをプログラムで設定するにはどうすればよいですか?

資格情報をプレーンテキストで保存しないというポリシーがあり、私は職場で特定の資格情報プロバイダーを使用する必要があります。

52
Gevorg

DataSourceBuilderスターターを使用している場合は、jdbcを使用できます。また、デフォルトの自動構成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();
}
75
Eddú Meléndez

スプリングブートの私のプロジェクトは、あなたの支援に従って正常に実行されました。 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();
    }
}
20
Alfer Wei

行う必要があるのは、@ BeanでDataSourceを返すメソッドに注釈を付けることだけです。完全な作業例を次に示します。

@Bean
public DataSource dataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url(dbUrl);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.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 boot jdbc Connection

4
zhuguowei

最新のスプリングブート(jdbcスターターと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();
}
3
ACV

別の方法として、次のような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;
}

ただし、次の理由から使用には注意してください。

注:このクラスは実際の接続プールではありません。実際には接続をプールしません。本格的な接続プールの単純な置き換えとして機能し、同じ標準インターフェイスを実装しますが、呼び出しごとに新しい接続を作成します。 参照

2
MMKarami