升级MariaDB连接器后出现SQLTransientConnectionException

时间:2017-05-16 13:04:39

标签: scala jdbc mariadb slick hikaricp

我已将"org.mariadb.jdbc" % "mariadb-java-client"连接器从1.5.9升级到1.6.0,由于超时异常,我在连接到数据库时开始失败。

我正在使用它与HikariCP 2.5.1和Slick 3.2.0。如果我再次将更改回滚到MariaDB连接器1.5.9,它就会成功连接,如果我尝试直接升级到2.0.1,它就会失败并出现同样的错误。

根据the 1.6.0 changelog,我们不应该尝试任何重大改变。但是根据the differences in the GitHub repository,它可能比更改日志中指定的更多:/

使用本地数据库的异常:

java.sql.SQLTransientConnectionException: xxx.db - Connection is not available, request timed out after 5006ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:548)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:186)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83)
at slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:18)
at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:439)
at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:47)
at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:38)
at slick.basic.BasicBackend$DatabaseDef$class.acquireSession(BasicBackend.scala:218)
at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:38)
at slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:239)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=localhost)(port=3306)(type=master) : Connection refused
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:156)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.throwException(ExceptionMapper.java:92)
at org.mariadb.jdbc.Driver.connect(Driver.java:108)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:95)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:101)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:430)
at com.zaxxer.hikari.pool.HikariPool.access$500(HikariPool.java:64)
at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:570)
at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:563)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
... 3 common frames omitted
Caused by: java.sql.SQLException: Could not connect to address=(host=localhost)(port=3306)(type=master) : Connection refused
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1020)
at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:481)
at org.mariadb.jdbc.Driver.connect(Driver.java:103)
... 12 common frames omitted
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connect(AbstractConnectProtocol.java:392)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1013)
... 14 common frames omitted

远程数据库的异常:

java.sql.SQLTransientConnectionException: xxx.db - Connection is not available, request timed out after 5003ms.
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:548)
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:186)
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83)
    at slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:18)
    at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:439)
    at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:47)
    at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:38)
    at slick.basic.BasicBackend$DatabaseDef$class.acquireSession(BasicBackend.scala:218)
    at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:38)
    at slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:239)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

2 个答案:

答案 0 :(得分:2)

至少在当地情况下,看起来确实如此:

  • 端口配置错误。或者,
  • 池大小超过数据库最大值。或者,
  • 用户名/密码不正确。或者,
  • 用户无权连接到服务器或指定的数据库。

java.net.ConnectException: Connection refused是套接字级错误。通常,这表示在指定端口上没有服务器运行,或者服务器因某些其他原因拒绝连接(安全性等)。

您可以仔细检查所有驱动程序/数据源属性以验证它们是否正确。如果您可以发布HikariCP配置,这可能很有用。

答案 1 :(得分:1)

免责声明:我是mariadb开发者之一

在1.6.0版本中,&#34; usePipelineAuth&#34;选项已更改连接实现。

  

在连接期间,执行不同的查询。当选项处于活动状态时,这些查询将使用管道发送(所有查询都将被发送,然后只有所有结果都被读取),从而允许更快地创建连接。

允许节省网络延迟。

禁用此选项可能会解决您的问题。

与此同时,我在mariadb跟踪器上创建了issue