【问题标题】:Tomcat dbcp removeAbandoned issueTomcat dbcp removeAbandoned 问题
【发布时间】:2018-02-08 05:18:42
【问题描述】:

有人可以解释一下如何正确使用 removeAbandoned 属性吗? 问题是,我们有在事务中运行的服务方法(应用@Transactional)。例如,主体可以是 1000 个选择语句,然后是 1000 个插入。 removeAbandoned 属性设置为 60 秒。现在,如果 1000 个插入语句的执行时间超过 60 秒,则会为下一个 db 语句抛出异常“连接已关闭”。为什么会发生这种情况以及如何克服这种情况?如果我删除 removeAbandoned 属性,每件事都运行良好。这是我的 dbcp 配置。

db.initialSize=5
db.maxActive=150
db.minIdle=0
db.maxIdle=8
db.defaultAutoCommit=false
db.defaultTransactionIsolation=-1
db.maxWaitMillis=3000
db.timeBetweenEvictionRunMillis=1000
db.minEvictableIdleTimeMillis=1000
db.testOnBorrow=true
db.testOnReturn=false
db.testWhileIdle=false
db.removeAbandoned=true
db.removeAbandonedTimeout=60
db.poolPreparedStatements=true
db.validationQuery=select 1

通过使用这些属性,我们正在构建一个数据源。如果我在这里做错了什么,请纠正我。我假设在哪里调用此服务,它会打开一个连接并执行 db 语句,但它试图在 removeAbandonedTimeout 之后使用相同的连接?

【问题讨论】:

    标签: spring tomcat jdbc tomcat-dbcp


    【解决方案1】:

    这是removeAbondoned的正常行为,检查here。您需要检查您的要求和约束并进行相应的配置。如果执行花费了这么多时间并且这是正确的实现,则调整配置(增加放弃超时或完全删除它)。

    这对于夜间作业和离线数据迁移过程可能很常见。如果有用户交互,我认为您需要考虑响应性,从而更改服务的实现。然后您可能需要将其分成不同的服务或调整内部 SQL 或删除一些不必要的调用,但保留超时配置。

    【讨论】:

    • 感谢您的回答 yaccoub。我们的工作也是在后台运行的。这实际上是为了在后台发送电子邮件。
    • 所以我认为你需要删除配置,因为它告诉服务器如果运行超过一定超时时间就关闭任何连接......如果你认为答案是正确的,请接受它
    • 删除对我有用。但这会影响整个应用程序。那么需要什么 removeAbandoned 属性。所以我想在不删除该属性的情况下克服这种情况。只是对解决方案感到好奇。
    • 如何为这些长时间运行的作业定义一个单独的数据源,用一个单独的持久化单元指向这个数据源并为目标方法注入这个持久化单元......这是一个常见的做法报告查询的案例 - 这是另一个用例,但策略可能是有效的 -
    • 这是个好主意。我很感激。 +1
    猜你喜欢
    • 2013-01-02
    • 2011-06-10
    • 2013-01-07
    • 2011-08-08
    • 2014-05-19
    • 1970-01-01
    • 2012-04-29
    • 2022-08-23
    • 2011-06-24
    相关资源
    最近更新 更多