我们有一个基于
的应用程序成功运行最多约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)