Slick / Tomcat / MariaDB Galera Cluster产生虚假的“无数据库选择”错误

时间:2015-05-26 18:47:43

标签: mysql tomcat jdbc slick mariadb

我们有一个基于

的应用程序
  • Typesafe的Slick数据库查询库v2.0
  • BoneCP连接池v0.8.0
  • tomcat7
  • 带有Galera Cluster的MariaDB 5.5.33

成功运行最多约48小时,然后开始抛出java.sql.SQLException: No database selected错误。此时,一些(但不是全部)查询将因此异常而失败。通过重启tomcat可以暂时“修复”该问题。

“没有选择数据库”错误的明显来源是在连接设置中未指定数据库模式名称,但是,在启动时加载的应用程序配置中给出了一次数据库连接参数,如果这是不正确的,我们会立即看到这个错误。

  • 启动后,不会以编程方式修改架构名称。

  • 我们不会独立于连接池接口打开连接。

  • 我们无法在此外的任何地方复制此错误 生产环境。负载似乎是一个因素,但目前还不清楚 怎么样。

  • 没有特定的查询与错误和检查相关联 MariaDB日志没有发现任何有趣的东西。

  • 我们没有看到其他数据库连接错误,如超时或连接 被意外关闭。

  • 我们也试过从BoneCP切换到没有效果的HikariCP。

以某种方式连接“丢失”架构名称,或者此错误掩盖了其他一些条件。什么可能导致这种情况发生?我们可以针对生产环境运行什么(合理的)非侵入式日志记录或诊断来诊断问题?

样本堆栈跟踪:

java.sql.SQLException: No database selected
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
    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:2530)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1199)
    at com.jolbox.bonecp.PreparedStatementHandle.execute(PreparedStatementHandle.java:140)
    at scala.slick.jdbc.StatementInvoker.results(StatementInvoker.scala:38)
    at scala.slick.jdbc.StatementInvoker.iteratorTo(StatementInvoker.scala:22)
    at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:64)
    at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:16)
    at scala.slick.jdbc.Invoker$class.firstOption(Invoker.scala:29)
    at scala.slick.jdbc.StatementInvoker.firstOption(StatementInvoker.scala:16)
    at scala.slick.jdbc.Invoker$class.first(Invoker.scala:36)
    at scala.slick.jdbc.StatementInvoker.first(StatementInvoker.scala:16)
    at scala.slick.driver.JdbcExecutorComponent$QueryExecutorDef.run(JdbcExecutorComponent.scala:32)
---- SNIP ----
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

0 个答案:

没有答案