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. 工作生活学习都需要勤总结,多思考,解决问题的过程, 记录解决问题的方式方法都是在提高自己.

JDBC针对SQLServer的sendStringParametersAsUnicode=false的验证的更多相关文章

  1. sqlserverdriver配置方法 jdbc连接sqlserver

    一.下载驱动程序. 下载地址:http://download.microsoft.com/download/8/B/D/8BDABAE2-B6EA-41D4-B903-7916EF3690EF/sql ...

  2. Java jdbc访问sqlserver,oracle数据库

    1.JDBC访问Oracle数据库 public class Jdbc_Oracle { // 静态代码块,只会执行一次,类似C#静态构造方法 static { try { // 加载数据库驱动一次 ...

  3. JAVA使用JDBC技术操作SqlServer数据库执行存储过程

    Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带 ...

  4. 使用JDBC访问SQLServer 2008

    使用JDBC访问SQLServer 2008 // 准备数据库驱动程序 String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriv ...

  5. JDBC连接SQLServer的几种方式

    第一种:JDBC-ODBC数据库连接桥(需要配置ODBC数据源,不需下载驱动) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con ...

  6. jdbc连接sqlserver,mysql,oracle

    class xxx{ private static String port = "1433"; private static String ip = "192.168.2 ...

  7. Java jdbc访问sqlserver,oracle数据库 DEMO

    1.JDBC访问Oracle数据库 public class Jdbc_Oracle { // 静态代码块,只会执行一次,类似C#静态构造方法 static { try { // 加载数据库驱动一次 ...

  8. JDBC连接SqlServer数据库(非默认实例)方法

    一般我们在连接数据库的时候都是用的默认实例名,今天遇到了用非默认是实例名:连接代码如下(Java): URL=jdbc:microsoft:sqlserver://192.168.1.85//DEMO ...

  9. 针对SQLServer数据库的通用访问类

    Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...

  10. Spark on Yarn:java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://localhost\\db_instance_name:1433;databaseName=db_name

    本文只是针对当前特定环境下,出现的问题找不到sqljdbc驱动的案例.具体出现原因,可能是spark版本问题,也可能是集群配置问题. yarn-client方式下: 通过--jars参数指定驱动文件位 ...

随机推荐

  1. Python——第二章:字典的循环、嵌套、"解构"(解包)

    字典进阶操作 -- 循环和嵌套 字典的循环 我们先看直接打印字典的样子,会分别对每对key:value进行打印,并使用,分隔他们 dic = { "赵四": "特别能歪嘴 ...

  2. Java 新技术:虚拟线程使用指南(二)

    虚拟线程是在 Java 21 版本中实现的一种轻量级线程.它由 JVM 进行创建以及管理.虚拟线程和传统线程(我们称之为平台线程)之间的主要区别在于,我们可以轻松地在一个 Java 程序中运行大量.甚 ...

  3. 华为云云容器引擎CCE产品文档带来4个升级,降低使用难度

    本文分享自华为云社区<华为云云容器引擎CCE产品文档优化升级!>,作者: 云容器大未来 . 云原生产品技术栈庞大,需要用户对容器.Kubernetes等核心技术都有扎实的理解和掌握:同时问 ...

  4. makefile:带你了解一种常用于GNU gcc编译的工具语言

    摘要:该文章主要介绍makefile,一种常用语GNU gcc编译的工具语言,同时LiteOS也是利用该文件对工程项目进行make构建生成执行文件的. LiteOS源码中使用makefile进行文件的 ...

  5. 详解Vue八大生命周期钩子函数

    摘要:Vue为生命周期中的每个状态都设置了钩子函数(监听函数) .每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用. 本文分享自华为云社区<一文带你弄懂Vue八大生命周期钩子函数&g ...

  6. 技术+案例详解无监督学习Autoencoder

    摘要:本篇文章将分享无监督学习Autoencoder的原理知识,然后用MNIST手写数字案例进行对比实验及聚类分析. 本文分享自华为云社区<[Python人工智能] 十五.无监督学习Autoen ...

  7. JerryScript:物联网开发者的得力工具

    摘要:本文档以Linux开发环境及realview-pbx-a9开发板为例,简单介绍LiteOS上jerryscript命令的使用. 本文分享自华为云社区<Jerryscript-让开发者事半功 ...

  8. 1个案例读懂——游戏产品如何用 A/B 测试做增长

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着国内游戏用户数量趋于饱和,中国游戏产业也从高速成长期逐渐转型,市场成熟度提升,竞争趋于精细化. 随着游戏出海以 ...

  9. 大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka

    目录 作用 app 产生各层数据的 flink 任务 bean 数据对象 common 公共常量 utils 工具类 app.ods.FlinkCDC.java package com.atguigu ...

  10. 【redis】 redis linux下安装 redis启动方式 redis典型场景 redis通用命令 数据结构和内部编码 redis字符串类型

    目录 上节回顾 今日内容 1 redis介绍 2 redis linux下安装 3 redis启动方式 3.1 最简启动 3.2 动态参数启动 3.3 配置文件启动 3.4 客户端连接命令 4 red ...