如何验证连接池是不是正常工作

Posted

技术标签:

【中文标题】如何验证连接池是不是正常工作【英文标题】:How to verify that connection pooling is working如何验证连接池是否正常工作 【发布时间】:2015-12-17 10:07:26 【问题描述】:

我已经在我的 Tomcat 配置中设置了连接池,但现在我想验证它是否真的在工作。

有没有办法转储某种活动连接的 ID,以便我可以验证请求之间使用的是同一个 ID?我检查了Oracle's Connection Documentation,但无济于事。

提前致谢!

【问题讨论】:

你用的是什么连接池? 你考虑过enabling JDBC logging吗? 一个连接池包含多个连接。无法保证在请求之间始终获得相同的连接。顺便说一句,您也总是可以得到一个新的 Connection 对象来包装实际的、重用的物理连接。你可以只打印你得到的连接的类名。它应该是池中的类,而不是 JDBC 驱动程序中的类。 你看过下面的链接吗? ***.com/questions/16395608/… @Paul 我正在使用 JDBC。 【参考方案1】:

检查池成员是否被重用的简单方法:如果您的 JDBC 供应商使用来自 Object 的标准 toString,您应该在打印连接时看到相同的值:

System.out.println("Connection="+conn);

如果这改变了每个池的 get 调用,那么连接就和以前不一样了。但是,如果您的 DataSource 每次都使用自己的处理程序类包装一个池连接,这可能对您根本没有帮助 - 通常这样做是为了使 close() 返回 DataSource 并保持底层连接打开。

如果您的 JDBC 供应商没有使用标准 toString(),您可以创建自己的字符串以在调试/测试语句中使用:

public String toString(Connection conn) 
    return conn.getClass().getName() + "@" + Integer.toHexString(conn.hashCode());


System.out.println("Connection="+toString(conn));

请注意,上述方法不能防止恶意代码更改Connection 的元素或使其处于不确定状态。例如我见过:改变自动提交模式,选择另一个默认数据库数据库模式(Sybase),不提交前一个事务!

对于某些数据库,您可以在使用前通过测试查询来缓解,但这会产生开销。

【讨论】:

所以我与 datasource.getConnection() 建立的每个连接都在创建一个新池? 不,我的意思是 JDBC 实现者的 Connection 定义可能被包装为 DataSource 实现者提供的瘦 Connection,以帮助协助池中的内务操作。无论 Connection 是一个新的包装器,还是相同的包装器,还是实际的 Connection 都取决于 DataSource 实现者。 我怎样才能检查池是否正常工作?我已经在tomcat服务器的context.xml中配置了。我需要一个可理解的代码 sn-p 可用于测试池的工作。 我认为您的问题略有不同:验证池是否正常工作意味着确认第二次使用(假设没有并发访问)返回相同的(单个)JDBC 连接。这与验证 Connection 是否正常工作不同,后者可以通过测试查询来确认。 Oracle 的示例可以运行 select null from dual 或 Sybase select user() 或类似的东西。【参考方案2】:

简单的检查是

SELECT SID, SERIAL# FROM V$SESSION WHERE SID = SYS_CONTEXT('USERENV', 'SID')

如果您的池大小为 1,您将从任何连接对象获得相同的值。如果您的池大小更大(这也取决于您是否有固定的池大小,或者它是否设置为在需要时增长)并且您同时有许多活动连接,您应该获得不同孪生的池大小数量。

如果连接是非池化的,创建和打开一个新的连接对象每次都会返回不同的值。

【讨论】:

这看起来像我希望的那样,但我不得不承认我不知道该代码是什么或如何使用它。它看起来不像 Java,也不像 Bash。我错过了什么吗? (这是 SQL 吗?如果是,我完全不知道它有那个功能) 这是 SQL。通过 java 连接执行它并取回值。另一种选择是在应用程序连接时查看数据库中 V$SESSION 的记录,例如使用 SELECT SID, SERIAL# FROM V$SESSION WHERE PROGRAM = ''。【参考方案3】:

有一个简单的答案,一个可以做更多工作的答案:如果您配置一个连接池并且没有在代码中的任何位置显式打开与数据库的连接,那么仅仅不存在手动连接创建应该是一个线索您的连接池有效。

由于连接池来自 Tomcat,它也将包含在您可以通过 JMX 访问的数据中 - 启用 JMX 并与您的 jconsole 连接。这将随时为您提供有关连接池的确切负载(已用连接、空闲连接、预分配连接)的信息。

【讨论】:

以上是关于如何验证连接池是不是正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何判断mysql数据库连接池是不是连接

如何检查是不是使用了连接池

使用连接池后返回连接时如何检查连接是不是处于活动状态?

tomcat 7 jdbc连接池和jdbc4验证

需要代码在java中创建连接池

如何确定实体框架是不是正在等待来自连接池的连接?