2017-02-10 10 views
0

Spring 4.3.6 및 Spring Boot 1.4.4를 사용하는 응용 프로그램이 JAR로 내보내집니다. 원격 Oracle 데이터베이스에 연결하고 싶지만 응용 프로그램을 중단하지 않고 구성을 외부화하는 데 문제가 있습니다.DataSource 용 외부 부팅 구성이 작동하지 않습니다.

이 내 현재 해결 방법입니다 : 위의와

import org.apache.tomcat.jdbc.pool.DataSource; 

@Bean 
public DataSource dataSource() { 
    DataSource dataSource = new DataSource(); 

    dataSource.setUrl("jdbc:oracle:thin:@ip-address:port:orcl"); 
    dataSource.setUsername("user"); 
    dataSource.setPassword("password"); 
    dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); 

    return dataSource; 
} 

, 내 응용 프로그램이 데이터베이스에 연결하고 성공적으로 쿼리를 실행할 수 있습니다. 내가 구성을 외부화 할 때 그러나, 다음과 같이

@Bean 
@ConfigurationProperties(prefix="app.datasource") 
public DataSource dataSource() { 
    return new DataSource(); 
} 

// application.properties 
app.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl 
app.datasource.username=user 
app.datasource.password=password 
app.datasource.driver-class-name=oracle.jdbc.OracleDriver 

나는 나의 봄 부트 컨트롤러에 jdbcTemplate.update(query)를 실행하려고 다음과 같은 오류가 (참고 위의 작품 외부화 제외)됩니다

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: The url cannot be null 

@ConfigurationProperties을 제거하고 app.datasourcespring.datasource으로 변경하려고했습니다. 또한 을 사용하여 javax.sql.DataSource을 반환하려고했지만 두 경우 모두 동일한 오류가 발생합니다.

내가 잘못하고있다. 구성을 성공적으로 외부화하는 올바른 방법은 무엇입니까?

+1

당신은 왜 당신 자신의'DataSource'를 만들고 있습니까? –

+0

처음에는 내 자신을 만들지 않았습니다. hsqldb를 사용했지만 Oracle 데이터베이스에 대한 액세스 권한이 없습니다. 나는 질문을했고 대답은 ojdbc로 바꾼다. 그래서 나는 그렇게했다. 이제는 jdbctemplate에 autowire 할 빈을 찾을 수 없으므로 스프링 참조를 읽었습니다 (이 작업을 시작한 이래로 n 번째 시간 동안). 문제는 데이터 소스가 어떻게 든 나타나지 않는다는 것입니다. 내가 뭘하고 있는지 추측하고 있는데, 아마도 맞춤 데이터 소스로 간주 될 수 있습니다. 따라서 내가 하나를 만들려고합니다. 그리고 이제는 자동으로 application.properties 설정으로 구성되지 않습니다 ... – thegreatjedi

+0

hsqldb는 oracle이 아닙니다 ... 그래서 분명히 결코 작동하지 않을 것입니다. 올바른 드라이버가 필요하며 수동 구성이 필요한 드라이버는 없습니다. 또한 예외는 (분명히) 데이터 소스가 있지만 연결이 이루어질 수 없다는 것을 나타내므로 사용자 이름/비밀번호 조합에 문제가있을 수 있습니다. 기본적으로 구성을 제거하고,'application.properties'에서'app.'를'spring.'으로 바꾸고 다시 시작하고 예외를 확인하십시오. –

답변

0

자신을 DataSource으로 만들 필요는 없습니다.

당신이 당신의 클래스 경로와 오라클 드라이버의

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-jdbc</artifactId> 
</dependency> 

실행 종속되어 있는지 확인하고 application.properties 파일에 다음과 같은 속성을 넣어 : 당신이 당신의 DataSource@Autowired 할 수 있어야 그 후

spring.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl 
spring.datasource.username=user 
spring.datasource.password=password 
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver 

자세한 내용은 다음을 참조하십시오. https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database

0

봄 부팅으로 제공되는 미리 정의 된 속성을 무시할 수 없습니다.

application.properties 파일에서 다음 속성을 사용하기 만하면됩니다.

spring.datasource.url=jdbc:oracle:thin:@ip-address:port:orcl 
spring.datasource.data-username=user 
spring.datasource.data-password=password 
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver 

항목 : https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html 외에도 위에서

, @ConfigurationProperties을 명확히하기는 클래스 레벨과 클래스가 DbProperties라는 이름의 한 "app"하지 "app.datasource" 이제

@ConfigurationProperties(prefix = "app") 

접두사와 속성을 사용 클래스의 마지막 부분은 키의 마지막 부분과 같습니다. application.properties

public class DBProperties { 
    private String url; 
    private String username; 
    private String password; 
    // setters and getters 
} 

이제 실제 구성/구성 요소 클래스는 다음과 같아야합니다.

@Component 
@ConfigurationProperties(prefix = "app") 
public class MyComponent { 
    DBProperties datasource = new DBProperties(); 

    public DBProperties getDatasource() { 
     return datasource; 
    } 

    public void setDatasource(DBProperties datasource) { 
     this.datasource = datasource; 
    }  
} 

있습니다

인스턴스 변수 이름은 키
  • datasource의 두 번째 부분과 동일 datasource입니다
    1. 당신이이 있다고 가정 클래스 수준의 인스턴스
  • 1

    입니다 두 개의 서로 다른 Oracle 데이터베이스에 대한 데이터 소스. 그럼 당신은 다음과 같은 특성 파일이 있습니다 구성 파일에서 다음

    /path/to/config/application.properties 
    
    oracle1.username=YourUser1 
    oracle1.password=YourPassword1 
    oracle1.url=jdbc:oracle:thin:@localhost:1521:XE 
    
    oracle2.username=YourUser2 
    oracle2.password=YourPassword2 
    oracle2.url=jdbc:oracle:thin:@192.168.0.3:1521:XE 
    

    :

    import oracle.jdbc.pool.OracleDataSource; 
    
    @Configuration 
    public class DatasourcesConfig { 
    
    @Autowired 
    private Environment env; 
    
    @Primary 
    @Bean(name = "dataSource1") 
    DataSource oracle1DataSource() throws SQLException { 
    
        OracleDataSource dataSource = new OracleDataSource(); 
        dataSource.setUser(env.getProperty("oracle1.username")); 
        dataSource.setPassword(env.getProperty("oracle1.password")); 
        dataSource.setURL(env.getProperty("oracle1.url")); 
        return dataSource; 
    } 
    
    @Bean(name = "dataSource2") 
    DataSource oracle2DataSource() throws SQLException { 
    
        OracleDataSource dataSource = new OracleDataSource(); 
        dataSource.setUser(env.getProperty("oracle2.username")); 
        dataSource.setPassword(env.getProperty("oracle2.password")); 
        dataSource.setURL(env.getProperty("oracle2.url")); 
        return dataSource; 
        } 
    } 
    

    당신이 항아리를 실행할 때 application.properties 파일의 외부 위치를 지정하려면, 다음을 설정 spring.config.location 시스템 속성으로, 당신은 시도 할 수 있습니다 :

    java -jar target/your-application-0.0.1.jar -Dspring.config.location=/path/to/config/ 
    

    가 application.properties 파일이 제외되어 있는지 확인 항아리

    을 구축 할 때