最近开发存储在sqlserver数据库上数据的接口,遇到了一个很诡异的问题,在程序中生成的sql单独放到sqlserver的命令中跑可以命中索引,但是在程序中跑时无法命中。
查寻了sqlserver中类似mysql中show process list的命令,查看了最近执行的sql语句,发现传输到sqlserver服务器的sql语句竟然和程序日志中输出的有差别
程序中使用了mybatis框架,采用jdbc url的方式连接的数据库,
为了能定位问题原因,使用tcpdump进行了抓包,在程序所在的服务器上抓与sqlserver接受端口一致的数据包,然后把数据dump下来,从wireshark上仔细查看,发现竟然发起的是一个sqlserver的rpc调用,compName 这个字段作为了rpc的一个参数进行传递,设置的类型为nvarchar, 和数据库中的字段对比,发现该字段在数据库中是varchar类型,根据之前的调试经验,怀疑是类型隐式转换导致的索引无法命中,经过同事的搜索,发现在jdbc的url中添加 sendStringParameterAsUnicode=false; 可以避免进行隐式的类型转换,jdbc竟然对于unicode的字符默认进行类型转换。。
在使用框架时看来真的需要对框架有一定的了解,否则遇到i问题时真是不容易解决