2016-10-14 2 views
0

연결이 닫힙니다.스프링 JdbcTemplate을 - 나는 봄 <code>jdbcTemplate</code> 기본 <code>SELECT</code>, 우리의 데이터베이스에 <code>INSERT</code>, <code>UPDATE</code> 및 <code>DELETE</code> 쿼리 (우리가 DB2를 사용)하기 위해 사용 내 뉴저지 REST 응용 프로그램과 장기 실행 문제를 했어

이 문제는 며칠마다 발생하므로 System.out에 오류 내용이 없습니다 (다음 번에 오류의 스크린 샷이 포함됨). 며칠에 한 번씩, "REST 서비스가 종료 되었기 때문에 내 REST 서비스의 일부 쿼리가 실패하기 시작합니다." 오류. 이 오류가 발생하면 Tomcat 응용 프로그램 서버를 다시 시작하기 만하면 문제가 다시 시작될 때까지 며칠 동안 문제가 해결됩니다.

며칠마다 서버를 다시 시작하면 최종 사용자가이 기능을 사용하기 시작하면 수용 가능한 해결책이 아닙니다. 따라서 누군가가 이러한 일이 발생하는 이유와 영구적으로 문제를 해결할 수있는 방법이 있다면 알려 주시기 바랍니다.

다음
package com.my.package; 

import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Primary; 

import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 
import javax.sql.DataSource; 

@Configuration 
public class DataSourceConfig { 

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

    @Bean(name = "ds1") 
    public JdbcTemplate jdbcTemplate1(@Qualifier("dataSource1") DataSource dataSource1) { 
     return new JdbcTemplate(dataSource1); 
    } 

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

    @Bean(name = "ds2") 
    public JdbcTemplate jdbcTemplate2(@Qualifier("dataSource2") DataSource dataSource2) { 
     return new JdbcTemplate(dataSource2); 
    } 
} 

내 application.properties있어 :

여기 내 봄 데이터 소스 설정의

ds1.datasource.url=url1 
ds1.datasource.username=user1 
ds1.datasource.password=pass1 
ds1.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver 

ds2.datasource.url=url2 
ds2.datasource.username=user2 
ds2.datasource.password=pass2 
ds2.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver 

나는 봄 JDBC 및 드라이버 종속 관계를 포함 내 pom.xml 파일을

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-jdbc</artifactId> 
</dependency> 
<dependency> 
    <groupId>ibm.db2</groupId> 
    <artifactId>db2jcc4.jar</artifactId> 
    <version>4.19.26</version> 
</dependency> 

마지막으로 jdbcTempla를 사용하여 간단한 SELECT 쿼리를 실행하는 예제가 있습니다. 테

@Autowired 
@Qualifier("ds1") 
private JdbcTemplate jdbcTemplate; 

List<Something> sampleQuery(){ 
    String sqlQuery = "SELECT * FROM TABLE"; 
    try { 
     return this.jdbcTemplate.query(
       sqlQuery, 
       (rs, rowNum) -> { 

        Something something = new Something(); 
        something.setVal1(rs.getString("FIELD1").trim()); 
        something.setVal2(rs.getString("FIELD2").trim()); 

        return something; 
       }); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
     System.out.println("error..."); 
     return new ArrayList<>(); 
    } 
} 

편집 : 오류가 여전히 일어나고있다. 이번에는 로그를 캡쳐 할 수 있습니다. 기본적으로 "새로 설정된 연결의 유효성을 검사하지 못했습니다." 나는 왜 그런지 모르겠다.

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Failed to validate a newly established connection. 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:772) 
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:261) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:115) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:103) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.sql.SQLException: Failed to validate a newly established connection. 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:811) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:626) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:185) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:127) 
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
    ... 81 more 

편집 # 2 : 올바른 하나 마지막으로 표시 @의 exoddus의 대답. 그의 대답을 읽고 그가 제공 한 Spring JDBC 문서 (기본 Tomcat JDBC 연결 풀 문서로 안내)를 살펴본 후에, 나는 방금 작동 할 때까지 많은 다른 속성으로 놀기 시작했다. DS2에 대한

ds1.datasource.url=jdbc:db2://database.domain.com:12345/DBMS 
ds1.datasource.username=admin 
ds1.datasource.password=admin 
ds1.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver 
ds1.datasource.max-active=200 
ds1.datasource.max-idle=200 
ds1.datasource.max-wait=20000 
ds1.datasource.min-idle=50 
ds1.datasource.test-while-idle=true 
ds1.datasource.test-on-borrow=true 
ds1.datasource.validation-query=SELECT 1 FROM SYSIBM.SYSDUMMY1 
ds1.datasource.time-between-eviction-runs-millis=30000 
ds1.datasource.remove-abandoned=true 
ds1.datasource.remove-abandoned-timeout=30 
ds1.datasource.abandon-when-percentage-full=50 
ds1.datasource.initial-size=50 
ds1.datasource.jdbcInterceptors=ResetAbandonedTimer 

반복 :

여기 내 생산 환경에서 사용하는 현재의 구성입니다. 이 구성은 대략 6 개월 전에 구현 한 이후로 잘 작동했습니다.

+0

연결 풀을 사용합니까? – Ralph

+0

내가 믿는가? 나는'spring-boot-startter-jdbc'가 tomcat-jdbc pooling을 기본값으로 사용한다고 생각합니다. – bscott

+0

6 개월 후에 이것을 추적 해 주셔서 감사 드리며, 여러분의 생각을 공유하십시오! – exoddus

답변

2

컨텍스트에 따라 DataSource 빈의 일부 매개 변수를 구성하려고합니다. 어쩌면 언젠가는 연결이 끊어 질 수도 있습니다. 그 중 일부는 절대로 출시되거나 완료되지 않기 때문입니다 (나는 단지 추측합니다). ds2

올바른 값

ds1.datasource.max-active=50 
ds1.datasource.max-idle=8 
ds1.datasource.max-wait=10000 
ds1.datasource.min-idle=4 
ds1.datasource.test-on-borrow=true 

같은 당신의 environtment/하드웨어에 따라 달라집니다 당신의 application.properties에 특성이 있다고 덧붙였다

보십시오. here을 보시면 데이터 소스와 풀에 대해 간결하고 잘 설명 할 수 있습니다.

Here 봄에 DataSource에 대한 또 다른 흥미로운 질문을 찾을 수 있습니다.

+0

또한 연결 풀에 대한 Spring 부트 섹션을 살펴보십시오. http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect- to-production-database – Ralph

+0

감사합니다. 지금 당장이를 구현하고 문제가 해결되는지 확인하겠습니다. 일반적으로 "연결이 종료되었습니다." 오류가 발생하면 다음주 금요일에 오류가 발생할 때까지 기다릴 것입니다 – bscott

+0

제공 한 속성의 값을 업데이트하고 더 추가했습니다 :'ds1.datasource.validation-query = "SELECT 1 FROM SYSIBM.SYSDUMMY1" '와'ds1.datasource.initial-size = 10'을 비교합니다. 다시 말하지만, '연결이 닫혀 있기 때문에 유효성 검사/테스트가 어렵습니다.' 며칠마다 문제가 발생했습니다. 나는이주의 나머지를 위해 신청을 가동시키고 달릴 것이다. '연결이 닫혀 있습니다.' 문제가 이번 주말에 나타나지 않으면이 솔루션이 올바르게 작동한다고 가정하고이를 올바른 대답으로 표시하십시오. – bscott

관련 문제