我会尽量解释我想知道的。
我有一个连接到 MySQL 数据库的 Java 网络应用程序。 如果我在 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
中显示的特定连接吗?
最佳答案
MySQL 不知道,所以它不能告诉你。
您的 Java 代码可以通过运行查询 SELECT CONNECTION_ID() AS connection_id
并记录输出来告诉您。这将与 SHOW [FULL] PROCESSLIST:
中显示的相同 ID
。
当然,请注意,这并不意味着该类仍然保持连接,只是它获得了连接。 hibernate 线程是空闲的,如果您正在池中,没有人可能会占用它们。最后持有连接的人可能已经将其释放到池中。
此外,请记住, hibernate 线程正在 hibernate ,因此它们通常不会伤害任何东西,就那样坐在那里 hibernate 。该时间是自上次用于查询以来的时间。
您可能还会发现,在 MySQL 和应用程序之间存在状态防火墙的情况下,由于过度空闲(有时疯狂的低时间,如 15 分钟),连接从防火墙的内存中空闲出来。应用程序倾向于启动与 MySQL 的大部分交互,因此应用程序会发现连接无用(多亏了防火墙),放弃它,并在经过这样的空闲期后尝试与服务器通信时获得一个新连接被防火墙拒绝,但服务器会愉快地等待永远不会到来的请求。发生这种情况时,这些连接正在 浪费服务器资源。如果发生这种情况,在服务器内核中启用 TCP keepalive 将缓解这种情况。防火墙可能是您没有意识到的基础设施的一部分。
关于java - 我能知道哪个类持有数据库连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149403/