bibi
115
2019-04-18 22:32:32 작성 2019-04-18 22:55:00 수정됨
3
154

DB 타임타웃 문제 문의드립니다 (gcloud java 프로젝트)


안녕하세요, 이 글은 STACK overflow에도 기재했는데 아직까지 답변을 받지 못해 여기 계신 분들께도 조언을 구하고자 올립니다.

현재 저는 gcloud app engine으로 두가지 프로젝트를 가동중입니다. admin이라는 사이트는 admin 자체의 인스턴트의 sql과 testingapp 이라는 다른 사이트(다른 프로젝트이며 다른 인스턴트로 구동중인 웹사이트임)의 db를 연결하여 사용중 입니다.(간략하게 정리하면 admin 앱은 db를 두개로 구동중입니다.)

여기서 문제는 ...

문제 : DB B의 연결이 배포이후 몇시간(정확한 시간을 확인할 수 없음 대략 12시간인듯함)이 지나면 죽어버림. 그리고 아래와 같은 에러메시지가 확인됨.

{"timestamp":1555464776769,"status":500,"error":"Internal Server Error","exception":"org.springframework.transaction.CannotCreateTransactionException","message":"Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 43,738,243 milliseconds ago.  The last packet sent successfully to the server was 43,738,243 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.","path":"/client/getAllCompany"}

해당 문제를 해결하기 위해 아래와 같은 설정들을 추가해서 재 배포하고 테스트 해봤지만 실패 했습니다.

1)   application.properties에 'autoReconnect=true' 추가해봄

api.datasource.url = jdbc:mysql://google/projectB?cloudSqlInstance=projectB:australia-southeast1:projectB&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false&autoReconnect=true

2) application.properties 에 아래와 같이 설정해봄

spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.time-between-eviction-runs-millis=3600000
spring.datasource.tomcat.min-evictable-idle-time-millis=7200000
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1

 제 프로젝트는  web.xml을 사용하지 않고 있습니다.

해당 문제는 제가 다시 프로젝트를 디플로이하면 B프로젝트의 B DB에 다시 연결됩니다. 하지만 대략 12시간 정도가 지나면 disconnect되는 것 같습니다.

시간 상관 없이 안정적으로 계속 DB B의 데이터를 쓸수 있게 하려면 어떻게 해야 할지 조언 부탁드립니다.

DB B의 HibernateConfig Code

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

@Bean(name = "apiEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean apiEntityManagerFactory(
        EntityManagerFactoryBuilder builder, @Qualifier("apiDataSource") DataSource dataSource
) {
    return builder.dataSource(dataSource).packages("com.workspez.api.entity").persistenceUnit("api").build();
}

@Bean(name = "apiTransactionManager")
public PlatformTransactionManager apiTransactionManager(
        @Qualifier("apiEntityManagerFactory") EntityManagerFactory apiEntityManagerFactory
) {
    return new JpaTransactionManager(apiEntityManagerFactory);
}

@Bean(name = "apiJdbc")
public NamedParameterJdbcTemplate apiJdbcTemplate() {
    return new NamedParameterJdbcTemplate(dataSource());
}

추가적으로 보통 sql 이 8시간 가량 콜을 못받으면 세션이 죽는 걸로 많이 설명을 해주시는데, 제 경우에는 콜을 해도 일정 시간이 지나면 디비 커넥션이 죽는 것 같습니다. 정확한 로그가 현재 없어 확인이 힘드네요 ㅠ

  

0
0
  • 답변 3

  • star16m
    487
    2019-04-19 01:01:31

    설정하신건 12시간유휴상태인 connection을 6시간마다 체크하고 계시는것 같네요

    min을 1시간 정도로 해두고 time-between 을 그보다 작은 수(10분정도??)로 해두면 될듯합니다

    검색해보니 기본값은 min 이 1분이고 time-between 이 5초 인것 같네요

    0
  • bibi
    115
    2019-04-19 11:27:13 작성 2019-04-19 11:27:49 수정됨

    star16m

    답변 감사합니다!  방금 조언해주신데로 config 재설정해서 재배포 한 상태에요. 오늘 오후에 결과를 지켜봐야 겠죠?!  잘 되었으면 좋겠네요  후기 남기겠습니다. 감사합니다.

    0
  • bibi
    115
    2019-04-22 10:41:01

    star16m

    아쉽게도 실패네요 ㅠㅠㅎㅎ 다른 방법을 더 찾아보는 중입니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.