首页 > 数据库 >JDBC针对SQLServer的sendStringParametersAsUnicode=false的验证

JDBC针对SQLServer的sendStringParametersAsUnicode=false的验证

时间:2023-12-09 10:34:18浏览次数:35  
标签:varchar SQLServer sendStringParametersAsUnicode 死锁 跟踪 false deadlock

JDBC针对SQLServer的sendStringParametersAsUnicode=false的验证


背景

部分客户的SQLServer数据库出现了大量死锁的情况.
虽然部分客户并没有反馈死锁影响了产品的正常使用
但是在大量业务时还是会出现卡顿等的现象 

基于此, 经过微软case的研究,发现是 JDBC4.0之后默认为ture的sendStringParametersAsUnicode
参数的影响. 会导致所有的varchar 字段经过JDBC后发给数据库的都变成了 nvarchar. 

导致他的执行计划和查询锁定的资源都发生了变化.
可能会导致一定概率的死锁. 

问题分析

前期学习整理过 
profiler 跟踪死锁
执行计划的学习

发现 隐式转换的确存在比较高的风险. 

结合 多种类型的数据库均没有出现类似的问题
只有SQLSERVER经常出现阻塞和死锁
只能往关于varchar类型隐式转换这方面进行考虑. 

需要说明, 这边所有的数据库的隔离级别都是
读已提交并且使用快照隔离. 

问题验证

更新应用对数据库的连接字符串, 并且增加参数:
sendStringParametersAsUnicode=false

开启profiler 进行跟踪
主要跟踪dead lock graph

发现经过一段时间的程序运行,没有出现之前经常出现的业务锁相关的内容

问题其实已经基本验证通过. 

其他问题

虽然业务锁没有了
但是大量跟踪到了 关于平台一个表的deadlock

这里就非常奇怪了.  其实在这次修改这个应用之前. 
我修改其他应用时也出现了大量的针对平台表的deadlock
但是当时没往这方面考虑. 现在只能够继续分析.

打开profiler 一边跟踪锁, 一边跟踪TSQL
在出现了新的deadlock 后 暂停TSQL的跟踪

ctrl + F搜索被锁的平台表, 发现执行的SQL为:
N'@P0 varchar(8000),@P1 varchar(8000),@P2 varchar(8000),@P3 varchar(8000)'

发现其实是符合预期的 传递的参数都变成了 varchar 字段.
但是不明确为啥会产生如此多的锁

突然想到这个表可能进行过一次国际化改造, 然后查询了一下表结构. 
发现果然大部分字段类型都已经是 nvarchar

相当于按下葫芦起来瓢

其实这个问题 本应该周三第一次修改验证时就已经发现. 
周三下午六点时已经发现了大量的 关于平台表的deadlock 
但是当时因为弄K8S-IPV6 没有进行深入的研究. 

所以才到周六加班时才发现. 

部分总结

虽然问题告一段落, 但是依旧有很多值得思考的地方: 
1. sendStringParametersAsUnicode=false 的确有效, 能够减少字段类型为 varchar的死锁
2. 如果业务代码不够规范, 没有实现强行的数据类型一致性. 应用程序varchar 自动给 nvarchar进行传值时
   如果没有sendStringParametersAsUnicode=true的保护, 对应的表会出现deadlock
3. 数据的一致性和代码的严谨性是非常重要的. 代码和数据库必须一致起来. 规范性的工作是产品优劣的最大区别之一. 
4. 不能小看任何技术细节, 技术细节可能不会让你发财, 但是很容易让你阴沟翻船. 
5. 工作必须要专注, 不能事项太多,不然很容易出现跟踪不彻底, 问题解决不透彻的情况. 
6. 技术储备非常重要. 需要多学习勤思考. 不要因为自己不知道就否决别人的观点, 需要自己多验证. 
7. 工作生活学习都需要勤总结,多思考,解决问题的过程, 记录解决问题的方式方法都是在提高自己. 

标签:varchar,SQLServer,sendStringParametersAsUnicode,死锁,跟踪,false,deadlock
From: https://www.cnblogs.com/jinanxiaolaohu/p/17890599.html

相关文章

  • 【SQLServer2019备份恢复】查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置
    在SQLServer2019AlwaysOn节点备份策略失败:备份数据库(完整)(8502-HIS-SQLAG\HISAG)备份数据库所在的位置:本地服务器连接兼容性级别为70(SQLServer7.0版)的数据库将被跳过。数据库:所有用户数据库类型:完整追加现有任务开始:2023-12-08T14:10:07。任务结束:20......
  • SqlServer常用语句
    --添加表描述EXECUTEsp_addextendedproperty'C','课程表','user','dbo','table','Course',NULL,NULL;--添加字段描述EXECUTEsp_addextendedproperty'MS_Description','课程ID','us......
  • 数据库数据恢复—sqlserver数据库和备份被加密,数据库文件名被篡改的数据恢复案例
    SQLServer数据库故障:某公司服务器上的SQLServer数据库被加密,无法使用。被加密的数据库有2个,数据库的MDF、LDF、log文件名字被篡改。数据库被加密截图:数据库备份被加密,文件名字被篡改:SQLServer数据库数据恢复过程:1、将故障数据库内的数据备份至北亚企安数据恢复中心的专用存......
  • 【SQLServer2019管理】备份环境包含数据库
    恢复报错信息:sp_configure值'containeddatabaseauthentication'必须设置为1才能创建包含的数据库。您可能需要使用RECONFIGURE设置value_in_use。(MicrosoftSQLServer,错误:12824)execsp_configure'containeddatabaseauthentication',1GOreconfigure;Go ......
  • 通过PowerShellPlus示例脚本学习PowerShell之-通过SMO获取SQLServer数据库
    ##=====================================================================##Title:Get-MSSQL-DB-UsingSMO##Description:ShowalldatabasesusingSMOforagivenserverinstance##Author:Idera##Date:1/28/2008##Input:-s......
  • .NET 6 使用Nlog 记录日志到本地并写入SQLserver数据库
    1.安装Nlog对应Nuget包版本NLog:5.0.4NLog.Database:5.0.4NLog.Web.AspNetCore:5.1.4Microsoft.Data.SqlClient:5.0.0(写入SQLServer数据库用的)2.建表SQLCREATETABLE[dbo].[NLog]( [Id][bigint]IDENTITY(1,1)NOTNULL, [Application][nvarchar](50)NOTNULL, [Lo......
  • SQLServer解决deadlock问题的一个场景
    SQLServer解决deadlock问题的一个场景背景公司产品出现过很多次deadlock跟研发讨论了很久,都没有具体的解决思路但是这边知道了一个SQLServer数据库上面计划100%出现问题的场景然后想着跟之前微软case一起处理一下看能否解决这个问题.整体思路1.修改默认的隔离级别......
  • SQLServer 性能报表的学习与使用
    SQLServer性能报表的学习与使用背景前面连续学习了SQLServer如何优化等事宜.但是一开始总是么有找到对应的问题解决思路周天时想到了SQLSERVER的MDW工具但是并没有找到一个合适的处理方式和方法.今天突然发现可以使用部分核心报表功能进行问题定位.所以想着总结一下,......
  • SQLServer数据库优化学习-总结
    SQLServer数据库优化学习-总结背景各种能力都需要提升.最近总是遇到SQLServer的问题趁着周末进行一下学习与提高.安装与优化1.数据库必须安装64位,不要安装成32位的版本2.数据库的序列号要使用enterprisecore的版本,不要使用enterprise的版本,仅可能使用20个......
  • SQLServer2019及SQLServer FC日志收集
    日志收集:===============1.SQLServer 错误日志 SQLServer2019:<DataDrive>:\ProgramFiles\MicrosoftSQLServer\MSSQL15.<instancename>\MSSQL\Log 以上路径可能根据您的实例名称不同而有所不同。请找到相应的“LOG”文件夹并压缩以后发送给我。 2. 应用程序日......