Java 获取 SQLServerConnection 中的 spid

想在代码中通过 sp_lock @spid 查看一下 DB 连接的锁的情况,但发现 connection 中没有 spid 属性。

数据库是 SqlServer,通过 debug 发现 SQLServerConnection.tdsChannel.spid 中保存了该值,但是这个属性是 private 的。

不仅 tdsChannel 属性是 private 的,就连 tdsChannel 的类型 TDSChannel 外部都访问不了。

最后只好用反射取出了 spid 的值。

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