Camunda 数据库连接关闭但被 camunda 引擎选中
Camunda DB connection closed but picked by camunda engine
我们正在使用 RDS/MySql 作为数据库的 camunda。它工作正常,但有时它说 DB 已关闭,因此抛出 ProcessEngine 异常。
这是我从我们的配置和日志中了解到的内容:
我们的池中随时有 5 个活动连接(在数据源配置中指定)
曾经有过关闭的场景
我们看到如下错误:
Request received Context path: /engine-rest Request received Path
Info: /user PathInfo: /user ExceptionHandler:
org.camunda.bpm.engine.ProcessEngineException: Process engine
persistence exception at
org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.rethrow(CommandInvocationContext.java:148)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.close(CommandContext.java:173)
at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:113)
at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:66)
at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30)
...... Caused by: org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
No operations allowed after connection closed. The error may exist in
org/camunda/bpm/engine/impl/mapping/entity/User.xml The error may
involve
org.camunda.bpm.engine.impl.persistence.entity.UserEntity.selectUserByQueryCriteria
The error occurred while executing a query SQL: select distinct RES.*
from ACT_ID_USER RES
order by RES.ID_ asc LIMIT ? OFFSET ? Cause:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
No operations allowed after connection closed.
我们的 tomcat 道具指定:minIdle = 5
;
我的最佳猜测:它在服务器上已关闭,但由于上述原因我们正在本地维护 属性。
根据 tomcat 文档 (https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html):
testOnBorrow = true;
validationQuery = "select 1";
这两个道具应该在验证连接时修复它。
我想弄清楚的问题:
如何重现这个问题?除了保持连接空闲几个小时外,发生这种情况的场景。
AWS RDS服务器是否关闭连接?如果有,我们能控制吗?
正如@Zelldon所说,可以减少连接超时,然后我们可以尝试一下。它按预期工作。
为了确定,我 运行 有两个 camunda 实例,一个有此修复,另一个没有。可以看到修复有效。
关于 RDS,它确实关闭了连接,但我找不到任何关于它的文档。
我们正在使用 RDS/MySql 作为数据库的 camunda。它工作正常,但有时它说 DB 已关闭,因此抛出 ProcessEngine 异常。 这是我从我们的配置和日志中了解到的内容:
我们的池中随时有 5 个活动连接(在数据源配置中指定)
曾经有过关闭的场景
我们看到如下错误:
Request received Context path: /engine-rest Request received Path
Info: /user PathInfo: /user ExceptionHandler:
org.camunda.bpm.engine.ProcessEngineException: Process engine
persistence exception at
org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.rethrow(CommandInvocationContext.java:148)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.close(CommandContext.java:173) at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:113) at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:66) at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30)
...... Caused by: org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
No operations allowed after connection closed. The error may exist in
org/camunda/bpm/engine/impl/mapping/entity/User.xml The error may involve
org.camunda.bpm.engine.impl.persistence.entity.UserEntity.selectUserByQueryCriteria
The error occurred while executing a query SQL: select distinct RES.*
from ACT_ID_USER RES
order by RES.ID_ asc LIMIT ? OFFSET ? Cause:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
No operations allowed after connection closed.
我们的 tomcat 道具指定:minIdle = 5
;
我的最佳猜测:它在服务器上已关闭,但由于上述原因我们正在本地维护 属性。
根据 tomcat 文档 (https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html):
testOnBorrow = true; validationQuery = "select 1";
这两个道具应该在验证连接时修复它。
我想弄清楚的问题:
如何重现这个问题?除了保持连接空闲几个小时外,发生这种情况的场景。
AWS RDS服务器是否关闭连接?如果有,我们能控制吗?
正如@Zelldon所说,可以减少连接超时,然后我们可以尝试一下。它按预期工作。
为了确定,我 运行 有两个 camunda 实例,一个有此修复,另一个没有。可以看到修复有效。
关于 RDS,它确实关闭了连接,但我找不到任何关于它的文档。