Java 获取 SQLServerConnection 中的 spid
🏷️ Java SQL Server
想在代码中通过 sp_lock @spid
查看一下 DB 连接的锁的情况,但发现 connection
中没有 spid
属性。
数据库是 SqlServer,通过 debug 发现 SQLServerConnection.tdsChannel.spid
中保存了该值,但是这个属性是 private
的。
不仅 tdsChannel
属性是 private
的,就连 tdsChannel
的类型 TDSChannel
外部都访问不了。
最后只好用反射取出了 spid
的值。
java
Connection conn = getConn()
SQLServerConnection sqlServerConnection = (SQLServerConnection) conn;
// 获取 tdsChannel 属性值
Field fieldTdsChannel = (SQLServerConnection.class).getDeclaredField("tdsChannel");
fieldTdsChannel.setAccessible(true);
Object channel = fieldTdsChannel.get(sqlServerConnection);
// 获取 spid 属性值
Class clssTdsChannel = fieldTdsChannel.getType();
Field fieldSpid = clssTdsChannel.getDeclaredField("spid");
fieldSpid.setAccessible(true);
int spid = (int)fieldSpid.get(channel);
// 回复两个属性为私有
fieldTdsChannel.setAccessible(false);
fieldSpid.setAccessible(false);