Spring Boot JPA-자동 재 연결 구성


107

좋은 작은 Spring Boot JPA 웹 애플리케이션이 있습니다. Amazon Beanstalk에 배포되며 데이터 유지를 위해 Amazon RDS를 사용합니다. 그러나 자주 사용되지 않으므로 이러한 종류의 예외로 잠시 후 실패합니다.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : 서버에서 성공적으로 수신 한 마지막 패킷은 79,870,633 밀리 초 전입니다.
서버로 성공적으로 전송 된 마지막 패킷은 79,870,634 밀리 초 전이었습니다. 서버 구성 값 'wait_timeout'보다 깁니다. 이 문제를 방지하려면 응용 프로그램에서 사용하기 전에 연결 유효성 만료 및 / 또는 테스트, 클라이언트 시간 초과에 대한 서버 구성 값 늘리기 또는 커넥터 / J 연결 속성 'autoReconnect = true'사용을 고려해야합니다.

이 설정을 구성하는 방법을 잘 모르겠고 http://spring.io (아주 좋은 사이트) 에서 정보를 찾을 수 없습니다 . 정보에 대한 아이디어 나 지침은 무엇입니까?


이것을 사용하여 인쇄 DataSource하고 속성을 확인 하십시오 . stackoverflow.com/a/36586630/148844 봄 부팅하지 자동 구성이됩니다 DataSource당신은 어떤 경우 @Beans을 정의하는가 DataSource. docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/...
클로이

답변:


141

나는 부팅이 DataSource당신을 위해 구성한다고 가정 합니다. 이 경우 MySQL을 사용하고 있으므로 application.properties최대 1.3에 다음을 추가 할 수 있습니다.

spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

djxak이 주석에 언급 한 바와 같이, 네 개의 연결 풀 봄 부트 지원을위한 1.4을 정의의 특정 네임 스페이스는 : tomcat, hikari, dbcp, dbcp2( dbcp1.5으로 사용되지 않습니다). 사용중인 연결 풀을 확인하고 해당 기능이 지원되는지 확인해야합니다. 위의 예는 바람둥이 용이므로 1.4+에서 다음과 같이 작성해야합니다.

spring.datasource.tomcat.testOnBorrow=true 
spring.datasource.tomcat.validationQuery=SELECT 1

의 사용이 있습니다 autoReconnect됩니다 하지 않는 것이 좋습니다 :

이 기능의 사용은 응용 프로그램이 SQLException을 제대로 처리하지 않을 때 세션 상태 및 데이터 일관성과 관련된 부작용이 있고 다음으로 인해 발생하는 SQLException을 처리하도록 응용 프로그램을 구성 할 수없는 경우에만 사용하도록 설계 되었기 때문에 권장되지 않습니다. 제대로 작동하지 않고 부실한 연결.


8
문서에서 키를 작성하는 방식을 조화 시켰기 때문입니다. 우리는 항상 사용 편안한 모두 너무 바인더를 spring.datasource.testOnBorrow하고 spring.datasource.test-on-borrow잘 작동합니다. 자세한 내용 은 설명서 를 확인 하십시오.
Stephane Nicoll 2015

17
다른 사람을 혼동 할 수 있기 때문에 : SELECT 1연결이 응용 프로그램에 전달되기 전에 테스트되었음을 ​​보장합니다. 를 사용 testOnBorrow = true하면 개체가 풀에서 차용되기 전에 유효성이 검사됩니다. 객체가 유효성 검사에 실패하면 풀에서 삭제되고 다른 객체를 빌리려고 시도합니다. 참고 – 참 값이 영향을 미치려면 validationQuery 매개 변수를 널이 아닌 문자열로 설정해야합니다.
Rick

14
경고! 봄 부팅에 1.4 이상이되었다 변경 : 네 개의 연결 풀 스프링 지원을위한 새로운 특정 네임 스페이스가 정의 : tomcat, hikari, dbcp, dbcp2. 따라서 예를 들어 tomcat-jdbcconnection-pool의 경우 속성은 다음 spring.datasource.tomcat.testOnBorrow=true과 같아야합니다 spring.datasource.tomcat.validationQuery=SELECT 1.
Ruslan Stelmachenko

1
두 개의 다른 데이터 소스를 직접 구성하는 경우 이러한 구성을 어떻게 제공합니까? spring.datasource.mydatasource1.tomcat.testOnBorrow = true spring.datasource.mydatasource1.tomcat.validationQuery = SELECT 1 spring.datasource.mydatasource2.tomcat.testOnBorrow = true spring.datasource와 같은 두 데이터 소스에 대해이 구성을 제공해야합니까? mydatasource2.tomcat.validationQuery = SELECT 1 아니면 따라야 할 다른 것이 있습니까 ??
Nitish Kumar

2
경고! 앱에서 DataSource @Bean을 정의하면 Spring Boot 풀을 구성 하지 않습니다 . docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/… If you define your own DataSource bean, auto-configuration will not occur. 나는 OAuth2에 대한 가이드를 따랐고 @Bean(name = "OAuth") public DataSource secondaryDataSource()...자동 구성되거나 사용되지 않았습니다 testOnBorrow.
Chloe

28

위의 제안은 저에게 효과적이지 않았습니다. 실제로 효과가 있었던 것은 application.properties에 다음 줄을 포함하는 것입니다.

spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 3600000
spring.datasource.validationQuery = SELECT 1

여기 에서 설명을 찾을 수 있습니다.


5
추가 한 링크 에는 데이터베이스 연결이 8 시간 이상 비활성 상태이면 자동으로 닫히고 위의 오류가 발생합니다. 따라서 솔루션은 연결이 장기간 비활성 상태로 유지되도록하는 것입니다. 다시 시작한 후 SQL 서버에 연결할 수있는 방법이 있습니까?
Akeshwar Jha

9

spring.datasource.tomcat.testOnBorrow=trueapplication.properties의 설정 이 작동하지 않았습니다.

아래와 같이 프로그래밍 방식으로 설정하면 문제없이 작동했습니다.

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

@Bean
public DataSource dataSource() {
    PoolProperties poolProperties = new PoolProperties();
    poolProperties.setUrl(this.properties.getDatabase().getUrl());         
    poolProperties.setUsername(this.properties.getDatabase().getUsername());            
    poolProperties.setPassword(this.properties.getDatabase().getPassword());

    //here it is
    poolProperties.setTestOnBorrow(true);
    poolProperties.setValidationQuery("SELECT 1");

    return new DataSource(poolProperties);
}

1
커스텀 데이터 소스를 선언하는 경우 스프링 기본 .tomcat을 사용하려고하기 때문일 수 있습니다. 따라서 사용자 정의 데이터 소스 빈을 생성 한 다음 @ConfigurationProperties (prefix = "spring.datasource.tomcat")를 데이터 소스 빈에 추가하면 애플리케이션 속성에서 설정할 수 있습니다. 내 예제 .. @Bean (name = "managementDataSource") @ConfigurationProperties (prefix = "management.datasource") public DataSource dataSource () {return DataSourceBuilder.create (). build (); } management.datasource.test - 온 - 차용 사실 =
저스틴

8

방금 Spring Boot 1.4로 이동했으며 이러한 속성의 이름이 변경되었음을 알았습니다.

spring.datasource.dbcp.test-while-idle=true
spring.datasource.dbcp.time-between-eviction-runs-millis=3600000
spring.datasource.dbcp.validation-query=SELECT 1

2
이름은 동일합니다. Spring Boot 문서 의 속성 이름 지정 섹션을 참조하십시오 .
Stephen Harrison

@StephenHarrison : 1.4에서 추가 된 dbcp. * 접두사에 주목하세요.이 경우에는 완화 된 바인딩이 적용되지 않습니다.
YM

1
@Pawel : 프로젝트에서 사용 가능한 풀링 구현에 따라 dbcp. * 속성이 아닐 수 있습니다. SQL 및 해당 데이터 소스 속성을
YM

4

whoami의 대답정답 입니다. 제안 된 속성을 사용하여이 작업을 수행 할 수 없습니다 (Spring Boot 1.5.3.RELEASE 사용).

완전한 구성 클래스이기 때문에 내 대답을 추가하고 있으므로 Spring Boot를 사용하는 사람을 도울 수 있습니다.

@Configuration
@Log4j
public class SwatDataBaseConfig {

    @Value("${swat.decrypt.location}")
    private String fileLocation;

    @Value("${swat.datasource.url}")
    private String dbURL;

    @Value("${swat.datasource.driver-class-name}")
    private String driverName;

    @Value("${swat.datasource.username}")
    private String userName;

    @Value("${swat.datasource.password}")
    private String hashedPassword;

    @Bean
    public DataSource primaryDataSource() {
        PoolProperties poolProperties = new PoolProperties();
        poolProperties.setUrl(dbURL);
        poolProperties.setUsername(userName);
        poolProperties.setPassword(password);
        poolProperties.setDriverClassName(driverName);
        poolProperties.setTestOnBorrow(true);
        poolProperties.setValidationQuery("SELECT 1");
        poolProperties.setValidationInterval(0);
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
        return ds;
    }
}

이 사용자 정의 코드가 필요한 이유와 Spring이 속성 파일에서 이러한 속성을 읽지 않는 이유를 알고 있습니까? 내 파일에 여러 데이터 소스 속성이 있으며 나머지 모든 속성을 문제없이 읽습니다.
Uncle Long Hair

3

비슷한 문제가 있습니다. Spring 4 및 Tomcat 8. Spring 구성으로 문제를 해결합니다.

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="initialSize" value="10" />
    <property name="maxActive" value="25" />
    <property name="maxIdle" value="20" />
    <property name="minIdle" value="10" />
     ...
    <property name="testOnBorrow" value="true" />
    <property name="validationQuery" value="SELECT 1" />
 </bean>

나는 테스트했다. 잘 작동한다! 이 두 줄은 데이터베이스에 다시 연결하기 위해 모든 작업을 수행합니다.

<property name="testOnBorrow" value="true" />
<property name="validationQuery" value="SELECT 1" />

3

누구나 사용자 정의 DataSource를 사용하는 경우

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

속성은 다음과 같아야합니다. 접두사가있는 @ConfigurationProperties를 확인합니다. 접두사는 실제 속성 이름 앞의 모든 것입니다.

management.datasource.test-on-borrow=true
management.datasource.validation-query=SELECT 1

Spring Version 1.4.4.RELEASE에 대한 참조


2

일부 사람들이 이미 지적했듯이 spring-boot 1.4+에는 4 개의 연결 풀에 대한 특정 네임 스페이스가 있습니다. 기본적으로 hikaricp는 spring-boot 2+에서 사용됩니다. 따라서 여기에서 SQL을 지정해야합니다. 기본값은 SELECT 1입니다. 예를 들어 DB2에 필요한 것은 다음과 같습니다. spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1

주의 사항 : 드라이버가 JDBC4를 지원하는 경우이 속성을 설정하지 않는 것이 좋습니다. 이것은 JDBC4 Connection.isValid () API를 지원하지 않는 "레거시"드라이버 용입니다. 이것은 데이터베이스에 대한 연결이 여전히 활성 상태인지 확인하기 위해 풀에서 연결이 제공되기 직전에 실행될 쿼리입니다. 다시이 속성없이 풀을 실행 해보십시오. HikariCP는 드라이버가 JDBC4와 호환되지 않는 경우 오류를 기록하여 알려줍니다. 기본값 : 없음


0

여러 데이터 소스가있는 YAML에서이를 수행하려는 사람들을 위해 이에 대한 훌륭한 블로그 게시물이 있습니다. https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot -신청/

기본적으로 다음과 같이 데이터 소스 속성과 데이터 소스를 모두 구성해야한다고 말합니다.

@Bean
@Primary
@ConfigurationProperties("app.datasource.member")
public DataSourceProperties memberDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("app.datasource.member.hikari")
public DataSource memberDataSource() {
    return memberDataSourceProperties().initializeDataSourceBuilder()
            .type(HikariDataSource.class).build();
}

@Primary다른 데이터 소스에서 제거 하는 것을 잊지 마십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.