出现如下错误
org.apache.commons.dbcp2.LifetimeExceededException: The lifetime of the connection [198,970] milliseconds exceeds the maximum permitted value of [60,000] milliseconds
我到底在做什么
- 我正在尝试将500个查询更新和删除加载到MS SQL 2019中。在这500个查询中,我们可以将50个查询视为事务边界的一部分。这意味着每秒只运行10个事务集。
现在我在Mule ESB 3.8.0中得到一个下面的错误,我有一个最小大小为256的连接池。如果有人可以建议,可能是什么原因?这是因为查询在DB中花费了更多的时间吗?这是DB查询问题吗?因为我看到一些事务集(50个查询)花费了超过3分钟。
我正在使用Hibernate查询
我不知道从哪里开始分析,如何处理这个问题。有人能建议吗?
更多错误:
2023-04-13 11:04:41,052 [4616] [WARN] commons.dbcp2.BasicDataSource | An internal object pool swallowed an Exception.
org.apache.commons.dbcp2.LifetimeExceededException: The lifetime of the connection [198,970] milliseconds exceeds the maximum permitted value of [60,000] milliseconds
at org.apache.commons.dbcp2.PoolableConnectionFactory.validateLifetime(PoolableConnectionFactory.java:424) ~[commons-dbcp2-2.1.1.jar:2.1.1]
at org.apache.commons.dbcp2.PoolableConnectionFactory.passivateObject(PoolableConnectionFactory.java:364) ~[commons-dbcp2-2.1.1.jar:2.1.1]
at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:578) [commons-pool2-2.4.2.jar:2.4.2]
at org.apache.commons.dbcp2.PoolableConnection.close(PoolableConnection.java:206) [commons-dbcp2-2.1.1.jar:2.1.1]
1条答案
按热度按时间hgc7kmma1#
这并不完全是一个错误。它是一个警告,表示连接已关闭,因为它超过了DBCP2数据库连接池中配置的最大时间,根据错误,该时间似乎为60秒(或60000毫秒)。这是由池内部处理的。您只需要担心它会给应用程序带来一些问题。否则,请忽略它,因为这只是数据库连接池的预期行为。例如,如果您的事务花费3分钟,这对于数据库操作来说听起来太长了,您可能希望增加生存期。但只有当事务实际上失败时。
从Mule的Angular 来看,你可以尝试作为一种基本的分析技术来捕获几个线程转储,并分析是否有许多线程在等待数据库的答案或做其他事情。我希望他们在等待数据库,但没有足够的信息。你必须学习如何解释线程转储,以及如何将其与应用程序联系起来。
从数据库端,数据库管理员(DBA)可以使用管理工具来了解数据库上的负载并识别瓶颈。例如,在某些情况下,缺乏适当的索引可能会导致查询延迟。
事实上,这个问题太抽象了。从应用程序上的症状(不一定是问题),您试图推断出问题。您需要查看查询和数据库,并在查看池之前开始分析行为。这并不意味着问题不可能在池中,但这类问题有许多因素,并且在不提供具体细节的情况下,通常不可能指出单个根本原因。