我可以知道哪个类持有数据库连接吗?

时间:2015-10-15 13:06:33

标签: java mysql tomcat

我会尝试解释我想知道的事情。

我有一个Java Web应用程序,可以连接到MySQL数据库。 如果我在MySQL中执行SHOW PROCESSLIST,我会有这样的行:

id: xxx
User: xxx
Host: XXX
db: XXX
Command: Sleep
Time: 12352
State:
Info: NULL

据我所知,每个进程都是与数据库的开放连接。

为了管理连接,我使用这样的池 http://www.chuidiang.com/java/mysql/BasicDataSource-Pool-Conexiones.php (这是西班牙语,但我认为你看到了这个想法)

所以要“打开”我建立的连接:

DataSource ds = ...;
con = ds.getConnection();

在内部,我的班级没有打开连接;它只是在池中打开了一个连接。

问题是: 我可以知道哪个班级正在举行(或已con = ds.getConnection()SHOW PROCESSLIST中显示的特定联系?

1 个答案:

答案 0 :(得分:0)

MySQL不知道,所以它不能告诉你。

您的Java代码可以通过运行查询SELECT CONNECTION_ID() AS connection_id并记录输出来告诉您。这与ID中显示的SHOW [FULL] PROCESSLIST:相同。

当然,请注意,这并不意味着类仍然保持连接,只是它获得了它。睡眠线程处于空闲状态,如果您正在共享, nobody 可能会持有它们。最后持有该连接的人可能已将其释放到池中。

另外,请记住,睡眠线正在睡觉,因此他们通常不会伤害任何东西,坐在那里睡觉。时间是自上次用于查询以来的时间。

您可能还会发现,在MySQL和应用程序之间存在状态防火墙的情况下,由于过多的空闲(有时会出现疯狂的低时间,如15分钟),连接会从防火墙的内存中闲置出来。该应用程序倾向于启动与MySQL的大多数交互,因此应用程序将发现连接是无用的(由于防火墙),放弃它,并在它在这样的空闲时间后尝试与服务器通信时获得一个新连接被防火墙拒绝,但服务器会愉快地等待从未来过的请求。发生这种情况时,这些连接 会浪费服务器资源。如果发生这种情况,在服务器的内核中启用TCP keepalive将缓解这种情况。防火墙可能是您未实现的基础架构的一部分。