2013-10-07 164 views
0

我希望C3P0上有一些专家可以帮助我回答以下问题。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 ms。 14:48:07 - 请求被拒绝。处理时间:1 ms。

C3P0显然知道数据库关闭并从池中删除连接。这可能需要一段时间,因为关闭数据库之后的第一个请求花费的时间比其他时间要长。我已经多次运行此测试,并且单个请求可能需要从1毫秒到3.5秒(这是超时时间)。此条目出现的次数与我为我的池定义的连接数相同。为了简单起见,我省略了其余的部分。

我认为C3P0能够立即从池中移除连接(在上面的例子中最快为258毫秒)是很好的,但是我有麻烦解释其他人为什么会这样工作。如果“setTestConnectionOnCheckin”和“setTestConnectionOnCheckout”设置为“false”,C3P0如何能够知道连接变差?

即使将它们设置为“true”,测试连接也应该尝试对数据库执行查询(例如“从double中选择1 + 1”)。我们的数据库出现故障,不应该测试超时?换句话说,C3P0不应该花费3.5秒来确定连接已经坏了吗?

非常感谢,提前。

回答

0

(道歉......这将是简洁的,我是phonebound。)

1)即使没有明确的连接测试已配置,C3P0测试,遇到异常而检出的,以确定是否连接他们仍然适合合并。

2)如果DBMS不可用,好的JDBC驱动程序将很快抛出异常。没有理由为什么这些内部连接测试应该很慢。

3)而不是轮询未使用的连接,以避免等待检查/新购置,您可以考虑设置配置参数checkoutTimeout。

祝你好运!