Spring引导应用程序中的套接字写入错误

问题描述:

我创建了一个spring-boot应用程序,它托管在Amazon EC2中。Spring引导应用程序中的套接字写入错误

这个问题似乎与MySQL数据库的实验连接。

经过一段空闲时间,下面的错误发生了,我的web服务返回错误500

我想知道,如果有一个配置属性,我可以添加到避免这种错误

Caused by: org.hibernate.TransactionException: JDBC begin transaction failed: 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:162) 
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1431) 
    at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:61) 
    ... 66 common frames omitted 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was57961 seconds ago.The last packet sent successfully to the server was 57961 seconds ago, which 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. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536) 
    at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4874) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    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.$Proxy42.setAutoCommit(Unknown Source) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:72) 
    ... 69 common frames omitted 
Caused by: java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 

我的配置属性有这些特性至今:

spring.datasource.url=xxxx 
spring.datasource.username=xxx 
spring.datasource.password=xxxx 
spring.datasource.driverClassName=com.mysql.jdbc.Driver 
spring.jpa.hibernate.ddl-auto=update 
server.port=80 
spring.datasource.time-between-eviction-runs-millis=10000 
spring.datasource.min-evictable-idle-time-millis=10000 

我建议你检查的javadoc,您正在使用的DataSource。如果是Tomcat的DataSource这是,如果它是在类路径的默认值,你可以设置

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

(例如)。其他数据源实现具有相似的属性,Spring Boot通过spring.datasource.*绑定到它们。

+0

是否在某处记录了行为?参考手册的属性如'spring.datasource.max-idle = 8',但我没有看到随处可见的直通行为(也不明白它是如何在'DataSourceAutoConfiguration'中工作的)。 – 2014-12-11 16:27:00

+0

这两个属性都列在最新指南中(http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties)。如果passthru功能不明显,请在github中提出文档问题。 – 2014-12-12 07:37:01