我使用tomcat连接池使用gradle运行Spring-Boot。所有标准的spring-boot-tools。我在该Web服务器上运行了几个soap- webservices。测试服务器负载时,一切正常。但是在约7.5小时不执行任何操作后,将发生此异常。当然可以,timeout但是我尝试通过以下方法防止它:
timeout
spring.datasource.url=jdbc:postgresql://mydb?autoReconnect=true
@transactional
JPA-Repository
我的数据库服务器正在运行,PostgreSQL 9.4.1 on x86_64-unknown-linux- gnu并且数据库与应用程序服务器之间没有防火墙。
PostgreSQL 9.4.1 on x86_64-unknown-linux- gnu
为什么我的连接在一定时间后会断开并且无法恢复?
我的应用程序属性:
# # [ Database Configuration Section ] # spring.jpa.database=POSTGRESQL spring.jpa.show-sql=false hibernate.format_sql=true hibernate.hbm2ddl.auto=validate spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy spring.datasource.platform=postgres spring.database.driverClassName=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://*****:5434/****** spring.datasource.username=***** spring.datasource.password=***** logging.file=*******.log logging.level.=WARNING
2015-09-29 11:58:50.598 INFO 10498 --- [nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2015-09-29 11:58:50.598 INFO 10498 --- [nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2015-09-29 11:58:50.674 INFO 10498 --- [nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 76 ms
2015-09-29 19:23:03.777 WARN 10498 --- [ool-3-thread-16] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 08006 2015-09-29 19:23:03.779 ERROR 10498 --- [ool-3-thread-16] o.h.engine.jdbc.spi.SqlExceptionHelper : An I/O error occurred while sending to the backend. 2015-09-29 19:23:03.785 INFO 10498 --- [ool-3-thread-16] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements 2015-09-29 19:23:03.836 ERROR 10498 --- [ool-3-thread-16] o.s.orm.jpa.JpaTransactionManager : Commit exception overridden by rollback exception java.net.SocketException: Connection timed out at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_25] at java.net.SocketInputStream.read(SocketInputStream.java:150) ~[na:1.8.0_25] at java.net.SocketInputStream.read(SocketInputStream.java:121) ~[na:1.8.0_25] at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:143) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:112) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:71) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:282) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1718) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] ... 61 common frames omitted Wrapped by: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:201) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:411) ~[postgresql-9.4-1202-jdbc41.jar!/:9.4] at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) ~[hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] ... 57 common frames omitted Wrapped by: org.hibernate.exception.JDBCConnectionException: could not execute statement
编辑:
我已经添加了它并当前对其进行了测试:
spring.datasource.testOnBorrow=true spring.datasource.validationQuery=SELECT 1
并删除autoReconnect。
autoReconnect
正如@Yuki Yoshida提到的那样,答案就这么简单。
我添加 spring.datasource.validation-query= select 1 spring.datasource.test-on- borrow=true 到我的配置,并且可以正常工作。
spring.datasource.validation-query= select 1
spring.datasource.test-on- borrow=true
借阅测试:
testOnBorrow:默认值:true 指示在从池中借用对象之前是否将对其进行验证。如果对象验证失败,它将被从池中删除,我们将尝试借用另一个对象。 validationQuery SQL查询,该查询将用于验证来自此池的连接,然后再将其返回给调用方。如果指定,则此查询必须是返回至少一行的SQL SELECT语句。如果未指定,则将通过调用isValid()方法来验证连接。
testOnBorrow:默认值:true
指示在从池中借用对象之前是否将对其进行验证。如果对象验证失败,它将被从池中删除,我们将尝试借用另一个对象。
validationQuery
SQL查询,该查询将用于验证来自此池的连接,然后再将其返回给调用方。如果指定,则此查询必须是返回至少一行的SQL SELECT语句。如果未指定,则将通过调用isValid()方法来验证连接。
我实际上已经尝试过了,但是由于默认设置,我没有明确地将借用测试设置为true。看起来您必须显式设置它。