2015-02-19 28 views
18

Tôi có ứng dụng khởi động mùa xuân trên cùng một máy chủ như Maria DB và cả hai đều chạy tốt trong một thời gian. Nhưng giữa 12 giờ và 2 ngày có vẻ như là ứng dụng khởi động mùa xuân mất kết nối đến cơ sở dữ liệu (stacktrace) và không phục hồi từ đó.Mùa xuân đang mất kết nối với DB và không khôi phục hoặc kết nối lại

Khi tôi khởi động lại ứng dụng mùa xuân, tất cả đều tốt một lần nữa.

Ứng dụng không được tải và khi nó mất kết nối, ứng dụng vẫn hoạt động nhưng kết nối db không phục hồi. DB không khởi động lại trong thời gian chờ đợi (thời gian hoạt động 4 tuần). Chỉ dịch vụ giám sát ping ứng dụng ping DB một lần một phút. (sức khỏe khởi động mùa xuân)

Các ứng dụng Java khác được kết nối với cùng một DB đang chạy tốt và không có bất kỳ vấn đề nào.

Câu hỏi của tôi là:

Tại sao lò xo không hồi phục từ lỗi đó và thử kết nối lại với DB? Làm thế nào tôi có thể thiết lập mùa xuân để kết nối lại với DB?

2015-02-19 15:25:48.392 INFO 4931 [qtp92662861-19] --- o.s.b.f.xml.XmlBeanDefinitionReader  : Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] 
2015-02-19 15:25:48.580 INFO 4931 [qtp92662861-19] --- o.s.jdbc.support.SQLErrorCodesFactory : SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 
2015-02-19 15:25:48.616 WARN 4931 [qtp92662861-19] --- o.s.jdbc.support.SQLErrorCodesFactory : Error while extracting database product name - falling back to empty error codes 

org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:296) 
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:320) 
    at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214) 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134) 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:97) 
    at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:413) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:468) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:478) 
    at org.springframework.boot.actuate.health.DataSourceHealthIndicator.doDataSourceHealthCheck(DataSourceHealthIndicator.java:98) 
    at org.springframework.boot.actuate.health.DataSourceHealthIndicator.doHealthCheck(DataSourceHealthIndicator.java:87) 
    at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:38) 
    at org.springframework.boot.actuate.endpoint.HealthEndpoint.invoke(HealthEndpoint.java:67) 
    at org.springframework.boot.actuate.endpoint.HealthEndpoint.invoke(HealthEndpoint.java:34) 
    at org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(HealthMvcEndpoint.java:102) 
    at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:769) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1667) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:280) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:186) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at onlinevalidation.CorsFilter.doFilter(CorsFilter.java:20) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:497) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:610) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:539) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.Util.getInstance(Util.java:360) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870) 
    at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1232) 
    at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1225) 
    at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:2932) 
    at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:2927) 
    at sun.reflect.GeneratedMethodAccessor76.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109) 
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80) 
    at com.sun.proxy.$Proxy68.getMetaData(Unknown Source) 
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:285) 
    ... 66 common frames omitted 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 758,805 milliseconds ago. The last packet sent successfully to the server was 37 milliseconds ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1036) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3427) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3327) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2526) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484) 
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1446) 
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:452) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:402) 
    ... 60 common frames omitted 
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2914) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3337) 
    ... 69 common frames omitted 

@Configuration 
@ComponentScan(value = "com.demo.validation",scopedProxy = TARGET_CLASS) 
@EnableAutoConfiguration 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
@EnableCaching(proxyTargetClass = true) 
@EnableAsync(proxyTargetClass = true) 
@EnableJpaRepositories 
@EnableTransactionManagement(proxyTargetClass = true) 
public class Configuration { 
    main(...) 
} 

Configuration

spring.datasource.url=jdbc:mysql://localhost/validation 
spring.datasource.username=validation 
spring.datasource.password=**** 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

Gradle.Build

dependencies { 
    //Boot 
    compile 'org.codehaus.groovy:groovy-all:2.3.7:indy' 
    compile 'org.springframework.boot:spring-boot-starter-actuator:1.1.8.RELEASE' 
    compile 'org.springframework.boot:spring-boot-starter-security:1.1.8.RELEASE' 
    compile 'org.springframework:spring-aspects:4.0.7.RELEASE' 
    compile 'org.springframework.boot:spring-boot-starter-aop:1.1.8.RELEASE' 
    compile 'org.springframework:spring-instrument:4.0.7.RELEASE' 
    compile('org.springframework.boot:spring-boot-starter-web:1.1.8.RELEASE'){ 
     exclude module: 'spring-boot-starter-tomcat' 
    } 

    //servlet container 
    compile 'org.eclipse.jetty:jetty-webapp:9.2.3.v20140905' 
    compile 'org.eclipse.jetty:jetty-servlets:9.2.3.v20140905' 

    //DB 
    compile 'org.springframework.boot:spring-boot-starter-data-jpa:1.1.8.RELEASE' 
    compile 'mysql:mysql-connector-java:5.1.34' 
    //compile 'org.mariadb.jdbc:mariadb-java-client:1.1.8' 
    runtime 'com.h2database:h2:1.4.182' 
+0

EHI, tôi nhận được cùng một vấn đề! .. bạn đã giải quyết với 'autoReconnect = true' hoặc bạn tìm thấy khác (tốt hơn) giải pháp? – Andrea

+0

Tôi đã chọn sử dụng autoreconnect = true, như trong trường hợp của tôi, tôi không có nhiều giao dịch. – Vadimo

Trả lời

9

mỗi một thành viên cấp cao trong Spring forums, mùa xuân DataSource không phải là inte được sử dụng cho sản xuất:

Các câu trả lời ở trên chỉ là một phần của giải pháp. Thật vậy, bạn cần quản lý giao dịch thích hợp VÀ bạn cần một hồ bơi kết nối. DriverManagerDataSource KHÔNG có nghĩa là để sản xuất, nó sẽ mở ra và đóng kết nối ngày tháng mỗi khi cần.

Thay vào đó, bạn có thể sử dụng C3P0 làm nguồn dữ liệu để xử lý kết nối lại và hoạt động tốt hơn nhiều. Dưới đây là một ví dụ nhanh của một cấu hình tiềm năng trong một cấu hình Spring xml:

<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="#{systemProperties.dbhost}" /> 
    <property name="user" value="#{systemProperties.dbuser}" /> 
    <property name="password" value="#{systemProperties.dbpass}" /> 
    <property name="maxPoolSize" value="25" /> 
    <property name="minPoolSize" value="10" /> 
    <property name="maxStatements" value="100" /> 
    <property name="testConnectionOnCheckout" value="true" /> 
</bean> 
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <constructor-arg ref="c3p0DataSource" /> 
</bean> 
+0

bài đăng trên diễn đàn đó là từ năm 2008 – micko

+2

@Hazok là chính xác. Từ tài liệu mùa xuân hiện tại "Việc triển khai trong bản phân phối Spring chỉ có nghĩa là cho mục đích thử nghiệm và không cung cấp tổng hợp." https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html#jdbc-datasource –

+1

đây là điều duy nhất đã giúp tôi trong 4 ngày tìm kiếm - cảm ơn bạn rất nhiều @ Hazok. tôi đã có nguồn dữ liệu trình quản lý trình điều khiển đó và tiếp tục mất kết nối của mình !!!! – caro

3

Hãy thử thay đổi URL kết nối của bạn để:

spring.datasource.url=jdbc:mysql://localhost/validation?autoReconnect=true 
+0

Tôi cũng thấy 'autoReconnect = true'. Nó không được khuyến khích, nhưng tôi không bao giờ tìm thấy một lý do sâu sắc tại sao, đặc biệt là trong bối cảnh với mùa xuân. – Vadimo

+1

Tôi biết - có một chút tranh cãi xung quanh tính năng đó, ví dụ: http://stackoverflow.com/questions/667289/why-does-autoreconnect-true-not-seem-to-work.Nhưng nó vẫn được hỗ trợ và có thể nó giải quyết vấn đề của bạn. Bạn đã thử? –

3

Spring (3) thiết lập khởi động cho hibernate và oracle:

spring.datasource.test-on-vay = true

spring.datasource.validation-query = chọn 1 từ kép


+2

Bạn có thể giải thích thêm về cách khắc phục sự cố này không? –

Các vấn đề liên quan