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

Posted

技术标签:

【中文标题】如何检查是不是使用了连接池【英文标题】:How to check if connection pool is used如何检查是否使用了连接池 【发布时间】:2017-04-04 12:52:57 【问题描述】:

我在 OSGI 框架 (Felix) 上使用 HSQLDB + EclipseLink + Gemini。尽管我在persistence.xml 中设置了池,但我严重怀疑未使用连接池,并且为每个请求创建一个新连接。如果使用连接池,如何检查 HSQLDB 端。

编辑 1 我以-Dhsqldb.reconfig_logging=false 开始我的应用程序。要在我的应用程序中启动 HSQLDB 服务器,我使用以下代码

p.setProperty("server.database.0", "file:"+dataBasePath);
p.setProperty("server.dbname.0", "testdb");
p.setProperty("server.port", "9001");
server = new Server();

这是我的 jdbc 网址:

 jdbc:hsqldb:hsql://localhost:9001/testdb;hsqldb.write_delay=false;hsqldb.sqllog=3;hsqldb.applog=3;server.silent=false

但是,在我的日志中,我仍然没有收到任何有关使用连接池的消息。这是我的日志:

2017-04-14 11:01:57,373 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | open start - state modified
2017-04-14 11:01:57,396 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | dataFileCache open start
2017-04-14 11:01:57,407 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | dataFileCache open end
2017-04-14 11:01:57,698 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | checkpointClose start
2017-04-14 11:01:57,699 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | checkpointClose synched
2017-04-14 11:01:57,825 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | checkpointClose script done
2017-04-14 11:01:57,826 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | dataFileCache commit start
2017-04-14 11:01:57,859 | TRACE | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | file sync end
2017-04-14 11:01:57,859 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | dataFileCache commit end
2017-04-14 11:01:57,934 | INFO  | Server @48b135ed | org.hsqldb.lib.FrameworkLogger | checkpointClose end

编辑 2 我在单独的进程(java -jar ..)中启动了 Hsqldb,并作为命令行参数添加了--silent false。现在在这个单独进程的控制台上,我看到以下内容:

[Server@a09ee92]: [Thread[HSQLDB Server @a09ee92,5,main]]: handleConnection(Socket[addr=/127.0.0.1,port=38959,localport=9001]) entered
[Server@a09ee92]: [Thread[HSQLDB Server @a09ee92,5,main]]: handleConnection() exited
[Server@a09ee92]: 3:SQLCLI:MODE:31
[Server@a09ee92]: [Thread[HSQLDB Connection @2b14b766,5,HSQLDB Connections @a09ee92]]: 3:Trying to connect user 'SA' to DB (mydb)
[Server@a09ee92]: [Thread[HSQLDB Connection @2b14b766,5,HSQLDB Connections @a09ee92]]: 3:Connected user 'SA'
[Server@a09ee92]: 3:SQLCLI:SQLPREPARE SELECT * FROM foo
[Server@a09ee92]: 3:SQLCLI:SQLEXECUTE:1
[Server@a09ee92]: 3:SQLCLI:SQLDISCONNECT
[Server@a09ee92]: [Thread[HSQLDB Server @a09ee92,5,main]]: handleConnection(Socket[addr=/127.0.0.1,port=38960,localport=9001]) entered
[Server@a09ee92]: [Thread[HSQLDB Server @a09ee92,5,main]]: handleConnection() exited
[Server@a09ee92]: 4:SQLCLI:MODE:31
[Server@a09ee92]: [Thread[HSQLDB Connection @f5cabc4,5,HSQLDB Connections @a09ee92]]: 4:Trying to connect user 'SA' to DB (mydb)
[Server@a09ee92]: [Thread[HSQLDB Connection @f5cabc4,5,HSQLDB Connections @a09ee92]]: 4:Connected user 'SA'
[Server@a09ee92]: 4:SQLCLI:SQLPREPARE SELECT * FROM test WHERE id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?))
[Server@a09ee92]: 4:SQLCLI:SQLEXECUTE:1
[Server@a09ee92]: 4:SQLCLI:MODE:18
[Server@a09ee92]: 4:SQLCLI:SQLDISCONNECT

HSQLDB Connection @XXXXXXXX 这一行对于每个查询都不同,此外对于我看到的每个查询Trying to connect user 'SA' to DB (mydb)。难道这一切都意味着没有使用连接池吗?

【问题讨论】:

我对 HSQLDB 的管理了解不多,但是您不能查看日志以查看何时创建新连接吗?最坏的情况,看一下文档:“可以使用属性 server.silent=false 启动服务器或 WebServer 实例。这会导致所有连接及其执行的语句在语句提交到服务器。" 以服务器身份运行并遵循上述server.silent=false 的建议。这是最简单的选择。 @fredt 请看我的编辑 1 您的配置不正确。您需要 p.setProperty("server.silent=false"); 您还应该将其他属性的列表添加到路径中,例如 p.setProperty("server.database.0", "file:"+dataBasePath+";hsqldb.write_delay=false;hsqldb.sqllog=3"); 并省略 hsqldb.applog=3 不必要的。同时查看控制台上的服务器输出。 @fredt 谢谢你的回答。我照你说的做了。然而,结果是一样的。在我看来,我没有收到任何 DEBUG 消息。你能说还有什么可以做的吗? 【参考方案1】:

服务器消息显示已建立连接,执行单个 SQL 语句,然后关闭连接。

你的怀疑是正确的,每个请求都会建立一个新的连接。

我们现在知道,要么根本没有使用该池,要么它没有正常工作并且没有重用其连接。也就是说,我们不知道连接池是否负责,或者应用程序没有使用连接池。这只能通过查看您的设置来找到,因为 HSQLDB 不知道是哪个软件建立了连接。

【讨论】:

以上是关于如何检查是不是使用了连接池的主要内容,如果未能解决你的问题,请参考以下文章

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

Java JDBC 连接池(如何检查)?

.net 如何使用oracle连接池

已达到调试最大连接池

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

mongodb如何管理连接的?有必要实现连接池吗