记一次sqlserver索引没有命中的问题

最近开发存储在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问题时真是不容易解决

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值