programing

Slick/Tomcat/MariaDB Galera 클러스터의 잘못된 "데이터베이스가 선택되지 않음" 오류

oldcodes 2023. 10. 6. 21:58
반응형

Slick/Tomcat/MariaDB Galera 클러스터의 잘못된 "데이터베이스가 선택되지 않음" 오류

애플리케이션을 기반으로 합니다.

  • Typesafe의 Slick 데이터베이스 쿼리 라이브러리 v2.0
  • BoneCP 연결 풀 v0.8.0
  • tomcat7
  • Galera 클러스터가 포함된 MariaDB 5.5.33

최대 48시간 동안 성공적으로 실행된 후에 던지기 시작합니다.java.sql.SQLException: No database selected실수.그러면 일부(일부는 아니지만) 쿼리가 이 예외를 제외하고 실패하기 시작합니다.Tomcat(톰캣)을 다시 시작하여 문제를 일시적으로 "수정"할 수 있습니다.

"No database selected" 오류의 명백한 원인은 연결 설정에서 데이터베이스 스키마 이름이 지정되지 않았다는 것입니다. 그러나 DB 연결 매개변수는 시작 시 로드되는 응용프로그램 구성에서 한 번 제공되므로, 오류가 발생한 경우 즉시 이 오류가 표시됩니다.

  • 시작 후 스키마 이름이 프로그래밍 방식으로 수정되지 않았습니다.

  • 연결 풀 인터페이스와 독립적으로 연결을 열지 않습니다.

  • 이러한 오류를 프로덕션 환경 외부 어디에서도 복제할 수 없었습니다.부하가 요인인 것으로 보이지만 방법은 불분명합니다.

  • 오류와 관련된 특정 쿼리가 없으며 MariaDB 로그를 검사해도 흥미로운 내용이 나타나지 않았습니다.

  • 시간 초과나 연결과 같은 다른 DB 연결 오류는 예기치 않게 닫히지 않습니다.

  • 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)

언급URL : https://stackoverflow.com/questions/30466513/spurious-no-database-selected-errors-with-slick-tomcat-mariadb-galera-cluster

반응형