Skip to content

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);