web-dev-qa-db-de.com

Konfigurieren Sie DataSource programmgesteuert in Spring Boot

Mit Spring Boot kann ich ein JdbcTemplate mit folgendem instanziieren:

Code:

@Autowired
private JdbcTemplate jdbcTemplate;

Eigenschaften:

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

Dies erstellt eine DataSource der Klasse: org.Apache.Tomcat.jdbc.pool.DataSource

Wie lege ich den DataSource-Benutzernamen/das Kennwort programmgesteuert fest?

Wir haben die Richtlinie, Anmeldeinformationen nicht im Klartext zu speichern, und ich muss einen bestimmten Anbieter für Anmeldeinformationen verwenden, bei dem ich arbeite.

54
Gevorg

Sie können DataSourceBuilder verwenden, wenn Sie jdbc starter verwenden. Um die Standard-Autokonfigurations-Bean zu überschreiben, müssen Sie Ihre Bean als @Primary Markieren.

In meinem Fall habe ich Eigenschaften, die mit dem Präfix datasource.postgres Beginnen.

Z.B

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

Wenn es für Sie nicht machbar ist, können Sie verwenden

@Bean
@Primary
public DataSource dataSource() {
    return DataSourceBuilder
        .create()
        .username("")
        .password("")
        .url("")
        .driverClassName("")
        .build();
}
77
Eddú Meléndez

Mein Projekt von Spring-Boot ist nach Ihrer Unterstützung normal gelaufen. Die Konfiguration der Yaml-Datenquelle ist:

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

Benutzerdefinierte DataSource

@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

Sie müssen lediglich eine Methode mit Anmerkungen versehen, die eine DataSource mit @Bean zurückgibt. Ein vollständiges Arbeitsbeispiel folgt.

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

Wenn Sie mehr Datenquellenkonfigurationen wünschen, z.

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

sie können den folgenden Code verwenden

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

siehe: Spring Boot JDBC-Verbindung

4
zhuguowei

Wenn Sie den neuesten Spring Boot (mit JDBC-Starter und Hikari) verwenden, werden Sie auf Folgendes stoßen: Java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. Um dies zu lösen:

  1. In Ihrer application.properties:

datasource.Oracle.url=youroracleurl

  1. Definieren Sie in Ihrer Anwendung als Bean (@Primary ist Pflicht!):
@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

Alternativ können Sie DriverManagerDataSource wie folgt verwenden:

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

Seien Sie jedoch vorsichtig, denn:

HINWEIS: Diese Klasse ist kein tatsächlicher Verbindungspool. Es werden keine Verbindungen zusammengefasst. Es dient lediglich als einfacher Ersatz für einen vollständigen Verbindungspool, der dieselbe Standardschnittstelle implementiert, jedoch bei jedem Anruf neue Verbindungen erstellt. Referenz

2
MMKarami