首页 > 数据库 >SQLServer数据库JDBC连接串参数的简单学习

SQLServer数据库JDBC连接串参数的简单学习

时间:2023-12-13 13:45:45浏览次数:36  
标签:JDBC 数据库 SQLServer sendStringParametersAsUnicode set 参数 SQL property

SQLServer数据库JDBC连接串参数的简单学习


背景

前段时间一直跟同事一起处理SQLServer 比其他数据库的deadlock更多的问题. 
涉及到了几个驱动的参数. 想着问题基本上告一段落, 将这一块的情况总结一下.
便于后续遇到问题时的快速处理.

关于参数

现阶段的字符连接串为: 
jdbc:sqlserver://ip:port;database=dbname;SelectMethod=direct;sendStringParametersAsUnicode=false

主要是修改了这两个字符串:
SelectMethod=direct
以及
sendStringParametersAsUnicode=false

这两个参数的含义: 
1. SelectMethod 
当这个参数值为cursor时, 理论上数据库里面被跟踪到了:
FETCH API_CURSOR00000000000880BE
类型的SQL就会少很多. 
根据官网的解释, 这个参数是cursor 时, 会对大查询创建多个游标, 然后使用jdbc的client就可以每次获取一部分结果集来进行使用
当需要更多结果集时, 使用查询SQL时创建的这个游标 执行FETCH就可以获取后面的查询结果集.
优点:
降低jdbc客户端的内存使用量.每次只需要返回和接受一部分数据就可以了.
将值修改为 direct之后:
客户端需要全量返回数据, 对客户端内内存要求变高,但是大量数据的查询性能会变好 
并且便于分析问题. 知道是谁被阻塞了. 

2. sendStringParametersAsUnicode 
这个参数是为了解决非utf8字符集情况下 unicode乱码问题的.
他会自动给应用程序生成的SQL做一次varchar类型到 nvarchar类型的转换.
会导致产品中大量出现隐式转换, 引起性能下降. 
微软官方解释, 曾经将这个参数修改成false, 将数据库CPU使用率从100%,优化到30%

但是存在一个风险是,如果代码开发时 数据库时 nvarchar字段,用于存放多国语言, 但是程序里面使用的是varcahr字段类型
有一定的概率出现乱码的情况. 需要应用层进行适配和修改. 

需要注意, 单独修改链接字符串可能无效, 需要jdbc解析字符串,并且准确的进行参数传递. 

其他的优化知识

前期在查看durid连接池时,发现应用层总有一个: PrepateStatement 的参数信息
Oracle数据库很早之前就已经实现了. 

应用层进行了SQL变量绑定之后,理论上每次过来的参数可以实现软软解析,最大程度的降低数据库的CPU算力.提高性能. 

SQLServer数据库这一方面应该也有, 但是需要改天进行一下验证

一个简要总结

修改参数和修改驱动其实没啥太大的区别
建议必须做一下比较完备的功能验证. 

一方面不应该导致性能下降, 至少应该在80%的大规模使用的场景上有性能提升才可以. 
一方面 应该保证已有功能准确可用, 不会出现程序错误和乱码以及其他异常问题

如果仅仅是一两个功能有问题,可以找对应的开发进行修改和完善
如果是大批量的报错, 则需要综合评估一下修改的成本和产出. 

官网的部分参数

第一个: 
sendStringParameters
If the sendStringParametersAsUnicode property is set to "true", String parameters are sent to the server in Unicode format.
If the sendStringParametersAsUnicode property is set to "false", String parameters are sent to the server in non-Unicode format such as ASCII/MBCS instead of Unicode.
The default value for the sendStringParametersAsUnicode property is "true".

第二个: 
selectMethod
If this property is set to "cursor," a database cursor is created for each query created on the connection for TYPE_FORWARD_ONLY and CONCUR_READ_ONLY cursors. 
This property is typically required only if the application generates large result sets that can't be fully contained in client memory. 
If this property is set to "cursor," only a limited number of result set rows are kept in client memory.
The default behavior is that all result set rows are kept in client memory. 
This behavior provides the fastest performance when the application is processing all rows.

第三个:
serverPreparedStatement
(Version 6.2+) 
This property can be used to control how many outstanding prepared statement discard actions (sp_unprepare) can be outstanding per connection 
before a call to clean up the outstanding handles on the server is executed.
If this property is set to <= 1, unprepare actions are executed immediately on prepared statement close. 
If it's set to > 1, these calls are batched together to avoid overhead of calling sp_unprepare too often.

其他类型: 
workstationID
The workstation ID. Used to identify the specific workstation in various profiling and logging tools.

userName
The database user, if connection with SQL user and password.

sendTimeAsDatetime
Set to "true" to send java.sql.Time values to the server as SQL Server datetime values.
Set to "false" to send java.sql.Time values to the server as SQL Server time values.

一个其他的知识

使用mysql的预编译对象PrepateStatement时,
一定需要设置useServerPrepStmts=true开启服务器预编译功能,
设置cachePrepStmts=true开启客户端对预编译对象的缓存。

作者:zhuke
链接:https://www.jianshu.com/p/d46f84aef4bc

标签:JDBC,数据库,SQLServer,sendStringParametersAsUnicode,set,参数,SQL,property
From: https://www.cnblogs.com/jinanxiaolaohu/p/17898864.html

相关文章

  • MySQL 可以针对表级别设置数据库引擎吗?怎么设置?
    可以针对不同的表设置不同的引擎。在createtable语句中使用engine=引擎名(比如Memory)来设置此表的存储引擎。完整代码如下:createtablestudent(idintprimarykeyauto_increment,usernamevarchar(120),ageint)ENGINE=MemoryMySQL可以针对每个表进行独立的存储引擎......
  • 请问数据库的完全备份包括对事务日志的备份吗?还是只包含数据文件的备份??差异备份包括对
    原文链接:http://www.mobiletrain.org/about/BBS/115022.htmlhttps://zhidao.baidu.com/question/1840172558963046980.html 完全备份(Fullbackup):完全备份是指备份整个数据库的操作,包括数据文件、日志文件和其他重要的数据库组件,通常用于创建数据库的初始备份或定期备份。差......
  • 通过PowerShellPlus示例脚本学习PowerShell之-输出SQLServer服务属性
    ##=====================================================================##Title:Get-MSSQL-ServerAttrib-Csv##Description:ConnecttoSQLServerandoutputserverattributestoCSV##Author:Idera##Date:1/28/2009##Input......
  • Sqlserver镜像高可用搭建
    1.安装前准备系统相同数据库软件版本补丁相同数据库目录相同数据库恢复模式为完整主备可以ping通,可以相互通过SMSS登录对方2.创建证书2.1.主服务器和镜像服务器创建主密钥USEmasterGOCREATEMASTERKEYENCRYPTIONBYPASSWORD='Pa$$w0rd';--删除主密钥USEma......
  • 用python实现电子公文传输系统中遇到的数据库连接问题
    在实现电子公文传输系统时,数据库连接是一个重要的问题。Python中有多种库可以用于数据库连接,比如SQLite、MySQL、PostgreSQL等。下面是一个简单的示例,演示如何使用Python连接MySQL数据库:importmysql.connector#连接数据库conn=mysql.connector.connect(host="localhos......
  • C# 从代码入门 Mysql 数据库事务
    目录生成数据库数据Mysql数据库事务基础数据库的并发一致性问题数据库事务的隔离级别BeginTransaction()和TransactionScope的区别BeginTransaction()可以不手动撤销TransactionScope总结DML是否可以使用事务顺序多操作嵌套事务事务范围封装DbContextTransactionScopeBeginT......
  • 向量数据库 及 LangChain 用法
    当今科技领域的发展日新月异,向量数据库成为了热门的话题之一。这些数据库以其高效的向量检索和相似度搜索功能,为各种应用场景提供了强大的支持。本文旨在汇总向量数据库Milvus、Zilliz、Faiss、Qdrant、LlamaIndex、Chroma、LanceDB、Pinecone、Weaviate、 基本介绍1.Milv......
  • 人大金仓数据库 生成时间列表
      SELECTto_char(generate_series('2024-12-01'::DATE,'2024-12-31'::DATE,'2day'),'YYYY-MM-DD')ASdate;SELECTto_char(generate_series('2024-12-1200'::DATETIME,'2024-12-1......
  • openGauss学习笔记-154 openGauss 数据库运维-备份与恢复-闪回恢复
    openGauss学习笔记-154openGauss数据库运维-备份与恢复-闪回恢复闪回恢复功能是数据库恢复技术的一环,可以有选择性的撤销一个已提交事务的影响,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚......
  • openGauss学习笔记-155 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-155openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-概述155.1概述openGauss提供的gs_dump和gs_dumpall工具,能够帮助用户导出需要的数据库对象或其相关信息。通过导入工具将导出的数据信息导入至需要的数据库,可以完成数据库......