IT story

Spring Boot에서 프로그래밍 방식으로 DataSource 구성

hot-time 2020. 12. 29. 07:54
반응형

Spring Boot에서 프로그래밍 방식으로 DataSource 구성


Spring Boot를 JdbcTemplate사용하면 다음을 사용하여 a 인스턴스화 할 수 있습니다 .

암호:

@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

이렇게하면 클래스의 DataSource가 생성됩니다. org.apache.tomcat.jdbc.pool.DataSource

프로그래밍 방식으로 DataSource 사용자 이름 / 암호를 어떻게 설정합니까?

자격 증명을 일반 텍스트로 저장하지 않는 정책이 있으며 내가 일하는 특정 자격 증명 공급자를 사용해야합니다.


스타터를 사용하는 DataSourceBuilder경우 사용할 수 있습니다 jdbc. 또한 기본 자동 구성 빈을 재정의하려면 빈을 다음과 같이 표시해야합니다.@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();
}

내 스프링 부트 프로젝트가 귀하의 도움에 따라 정상적으로 실행되었습니다. 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으로 DataSource를 반환하는 메소드에 주석을 달기 만하면됩니다. 완전한 작업 예는 다음과 같습니다.

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

더 많은 datesource 구성을 원한다면

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


최신 스프링 부트 (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();
}

다른 방법으로 다음과 같은 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;
}

그러나 다음과 같은 이유로 사용에주의하십시오.

NOTE: This class is not an actual connection pool; it does not actually pool Connections. It just serves as simple replacement for a full-blown connection pool, implementing the same standard interface, but creating new Connections on every call. reference


for springboot 2.1.7 working with url seems not to work. change with jdbcUrl instead.

In properties:

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

In java:

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

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

ReferenceURL : https://stackoverflow.com/questions/28821521/configure-datasource-programmatically-in-spring-boot

반응형