我正在使用由 H2 1.4.199 數(shù)據(jù)庫支持的 Dropwizard 1.3.12。在我的數(shù)據(jù)庫配置中database: ... validationQuery: "/* MyService Health Check */ SELECT 1" validationQueryTimeout: 3s ...我遇到的問題是 3 秒的超時也會傳播到 Dropwizard 應用程序中完成的真實數(shù)據(jù)庫查詢。某些數(shù)據(jù)庫查詢被此超時中斷。我寧愿讓他們多等一會兒。從我的理解validationQueryTimeout應該只控制超時validationQuery。在應用程序內(nèi)部完成的真實數(shù)據(jù)庫請求不應受此影響。我試過刪除validationQueryTimeout,這似乎可以解決問題并刪除查詢超時。這樣做我認為是最后的解決方法,因為我認為在從連接池獲取連接時驗證連接已啟動并正在運行的查詢超時是有意義的。我嘗試使用 Postgresql,但似乎validationQueryTimeout不會影響其他數(shù)據(jù)庫查詢。我已經(jīng)進行了一些調(diào)試,并認為我找到了原因,但我缺乏一個好的解決方法。在執(zhí)行驗證時,tomcat-jdbc 在驗證語句上設置查詢超時。 https://github.com/apache/tomcat/blob/9.0.16/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java#L536-L544 stmt = connection.createStatement(); int validationQueryTimeout = poolProperties.getValidationQueryTimeout(); if (validationQueryTimeout > 0) { stmt.setQueryTimeout(validationQueryTimeout); } stmt.execute(query); stmt.close();這里的大問題是 H2 將超時保持在連接級別而不是語句級別。https://github.com/h2database/h2database/blob/version-1.4.199/h2/src/main/org/h2/jdbc/JdbcStatement.java#L695-L717 /** * Sets the current query timeout in seconds. * Changing the value will affect all statements of this connection. * This method does not commit a transaction, * and rolling back a transaction does not affect this setting. * * @param seconds the timeout in seconds - 0 means no timeout, values * smaller 0 will throw an exception * @throws SQLException if this object is closed */有什么我可以做的嗎?或者 h2 或 tomcat-jdbc 是否需要修復?我能想到的是在為驗證查詢設置當前查詢超時值之前獲取 tomcat-jdbc 中的當前查詢超時值,然后在運行驗證查詢后將其設置回該值。
添加回答
舉報
0/150
提交
取消