我希望有一些关于C3P0的专家可以帮助我回答以下问题。
首先,这是我试图解决的一般问题。我们有一个连接到数据库的应用程序。当数据库熄灭时,请求开始需要几秒钟才能处理,而不是几毫秒。这是因为C3P0将尝试创建与数据库的新连接。它最终会超时,请求将被拒绝。
我提出了解决问题的建议。在从池中获取连接之前,我将查询C3P0的API以查看池中是否存在任何连接。如果没有,我们会立即删除请求。这样,我们的延迟应保持在毫秒内,而不是等到超时发生。此解决方案有效,因为如果C3P0检测到它们已经坏了,就能够删除连接。
现在,我设置了一个测试,其中“setTestConnectionOnCheckin”和“setTestConnectionOnCheckout”的值为“false”。根据我的理解,这意味着C3P0不会测试连接(或者说,使用连接,因为还有idleConnectionTestPeriod设置)。但是,当我在关闭数据库后立即运行测试时,C3P0会检测到它并从池中删除连接。为了给你一个更清晰的图片,这是执行结果:
14:48:01 - 请求已成功处理。处理时间:5毫秒。 14:48:02 - 请求已成功处理。处理时间:4毫秒。 14:48:03 - (数据库此时关闭)。 14:48:04 - java.net.ConnectException。 14:48:05 - 请求被拒绝。处理时间:258毫秒。 14:48:06 - 请求被拒绝。处理时间:1毫秒。 14:48:07 - 请求被拒绝。处理时间:1毫秒。
C3P0显然知道数据库已关闭并从池中删除了连接。这可能需要一段时间,因为数据库关闭后的第一个请求比其他请求花费的时间更长。我已多次运行此测试,单个请求可能需要1毫秒到3.5秒(这是超时时间)。此条目显示的次数与我为池定义的连接数一样多。为简单起见,我省略了所有其余内容。
我认为C3P0能够立即从池中删除连接(很好,在上面的例子中只有258毫秒),但是我很难解释其他人为什么会这样做。如果“setTestConnectionOnCheckin”和“setTestConnectionOnCheckout”设置为“false”,C3P0如何知道连接变坏了?
即使将它们设置为“true”,测试连接也应该尝试在数据库上执行查询(例如“从双选择1 + 1”)。我们数据库发生故障,不应该测试超时吗?换句话说,C3P0不应该用3.5秒来确定连接已经坏了吗?
非常感谢,提前。
答案 0 :(得分:0)
(道歉......这个很简洁,我是电话。)
1)即使没有配置显式的连接测试,c3p0也会测试在签出时遇到异常的Connections,以确定它们是否仍然适合池化。
2)如果DBMS不可用,好的JDBC驱动程序会快速抛出异常。没有理由为什么这些内部连接测试应该很慢。
3)您可以考虑仅设置config参数checkoutTimeout,而不是轮询未使用的Connections以避免等待检查/新采集。
祝你好运!