java - Spring Boot webservice JDBC偶尔无法获得连接

标签 java mysql spring spring-boot jdbc

我们的 Spring Boot Web 应用程序存在问题,但我们无法缩小范围,也无法可靠地重现它。有时,我们的应用程序无法获取 JDBC 连接,只会挂起 15 分钟。 15 分钟后,将获得与数据库的连接,该过程将顺利完成(尽管由于 Apache 超时和在此过程完成之前很长时间关闭套接字而导致管道错误,但它无法返回响应)。此时的应用日志显示:

调试 o.s.jdbc.datasource.DataSourceUtils - 从数据源获取 JDBC 连接

然后什么都没有,直到 15 分钟后应用程序启动。 MYSQL 日志在这里什么也没有显示。与此同时,其他事务通过这个应用程序运行得很好,建立了数据库连接,没问题。但是这个线程被锁定了。

我们正在使用 spring-boot-starter-jdbc 和 java 1.8 连接到 Maria 10.0 数据库。 这是与数据源设置相关的 application.properties:

spring.datasource.url=jdbc:mysql://ourDatabase
spring.datasource.username=AUser
spring.datasource.password=aSecretPassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

最后,我们确实收到了一个看起来相关的错误堆栈跟踪:

2017-12-21 09:36:52,913 70038378 [ajp-bio-8009-exec-1] DEBUG o.a.t.jdbc.pool.PooledConnection  - Unable to validate object:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 3,790,114 milliseconds ago.  The last packet sent successfully to the server was 929,256 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:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3559)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3459)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3900)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2444)
at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)
at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:532)
at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:443)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:802)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:651)
at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)

最佳答案

通过更改几行并向 application.properties 添加新行

spring.datasource.url=jdbc:mariadb://ourDatabase

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

我们产生了类似的异常,其余结果与上述相同。

2017-12-21 16:56:41,959 4475051 [ajp-bio-8009-exec-2] DEBUG o.a.t.jdbc.pool.PooledConnection  - Unable to validate object:
java.sql.SQLNonTransientConnectionException: (conn=1076254) Connection timed out (Read failed)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:175)
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:110)
        at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:235)
        at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:332)
        at org.mariadb.jdbc.MariaDbStatement.execute(MariaDbStatement.java:383)
        at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:532)
        at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:443)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:802)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:651)
        at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)
        at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
        at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:394)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:474)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:484)
        at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:494)
        at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:500)

此异常介于

Fetching JDBC Connection from DataSource
之间 和

Returning JDBC Connection to DataSource

关于java - Spring Boot webservice JDBC偶尔无法获得连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47931159/

相关文章:

sql - 如何获取MySQL中单个表的笛卡尔积

MYSQL查询只在集合中

PHP 拆分 fwrite 以节省内存

java如何处理rabbitmq消息的回调

java - 某些 .tiff 文件无法从 pdf.js 查看

java - spring-kafka 使用 Avro 序列化/反序列化 org.springframework.messaging.Message 对象

java - 使用 Spring 依赖注入(inject)时,Hibernate SessionFactory 始终为 null

spring - Spring 中的拦截器与方面?

java - 打印到映射器中的屏幕变量

java - map 内 map 迭代