2017-12-22 27 views
1

후 이미 닫힌 연결을 반환하는 것은 여기에 지속적인 데이터베이스 작업이 발생하는 경우 잘 작동 DataSource적인 DataSource.getConnection 방법은 데이터베이스 다시 시작하거나 이상적인 시간 제한

DataSource dataSource = DataSourceBuilder.create().url(url).username(userName).password(password).driverClassName(dataSourceReader.getSqlServerDriverClassName()).build(); 
Connection connection = dataSource.getConnection(); 
System.out.println(connection.isClosed()); //Print false 

모두에서 데이터베이스 Connection를 얻기 내 코드입니다. 내 응용 프로그램을 이상적인 시간 (연결 시간 초과)으로 설정하거나 데이터베이스 서버를 다시 시작하고 위의 코드를 실행하려고하면 연결이 닫히고 connection.isClosed()의 출력이 참입니다. connection에서 작업을 수행하면 아래 예외를 throw합니다

com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) ~[sqljdbc4-4.0.jar!/:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388) ~[sqljdbc4-4.0.jar!/:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareCall(SQLServerConnection.java:2176) ~[sqljdbc4-4.0.jar!/:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareCall(SQLServerConnection.java:1861) ~[sqljdbc4-4.0.jar!/:na] 
    at sun.reflect.GeneratedMethodAccessor148.invoke(Unknown Source) ~[na:na] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) ~[tomcat-jdbc-8.5.6.jar!/:na] 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) ~[tomcat-jdbc-8.5.6.jar!/:na] 
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) ~[tomcat-jdbc-8.5.6.jar!/:na] 
    at com.sun.proxy.$Proxy100.prepareCall(Unknown Source) ~[na:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 

놀랍게도 동일한 코드는 내 Java 응용 프로그램을 다시 시작한 후에 정상적으로 작동합니다.

이 상황을 처리하기위한 제안이 있으십니까?

닫힌 연결을 다시 열 수 있습니까?

자세한 내용 :

  • 자바 버전 : 1.8.0_25
  • 응용 프로그램 서버 : 톰캣 8 봄 부팅
  • 데이터베이스와 : 마이크로 소프트 SQL 서버 표준 버전 (64 비트) 버전 10.50.1617.0
  • 데이터베이스 드라이버 : com.microsoft.sqlserver:sqljdbc4:4.0'

답변

0
견고하려면 응용 프로그램도없고를 처리 할 수 ​​있도록 설계되어야한다

왜냐하면 기업 환경에서 여러 가지 이유로 발생할 수 있기 때문입니다. 이것을 처리하는 한 가지 방법은 연결 객체에서 SQL 예외를 잡아 내고 성공하거나 다시 설정 한 재시도 한계에 도달 할 때까지 연결을 다시 시도하는 것입니다. 환경 및 jdbc 드라이버 또는 응용 프로그램 서버가 연결 풀링을 수행하는지 여부에 따라 풀이 실패 할 때까지 풀을 재 시도해야 할 수도 있습니다. 재 시도를 모든 연결 풀의 크기로 제한하여 무한정 반복하지 않을 수 있습니다.

+0

dbcp의'BasicDataSource'를 사용했으며 연결 시간 초과 및 데이터베이스 재시작 후에 작동합니다. 내 문제를 해결한다. –