架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4762|回复: 3

[资料] Java JDBC 之 rewriteBatchedStatements、allowPublicKeyRetrieval...

[复制链接]
发表于 2022-2-11 13:59:18 | 显示全部楼层 |阅读模式
Java JDBC 之 rewriteBatchedStatements、allowPublicKeyRetrieval、allowMultiQueries、sslMode 配置性能优化。

jdbc 所有配置属性文档:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html

回顾:

.NET/C# 操作 MySQL 数据库之 SslMode 性能优化
https://www.itsvse.com/thread-9956-1-1.html

allowPublicKeyRetrieval

在使用 MySQL 8.0 时重启应用后提示 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed

最简单的解决方法是在连接后面添加 allowPublicKeyRetrieval=true

如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启。



rewriteBatchedStatements

MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效

MySQL Jdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。

只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL (jdbc:mysql://ip:port/db?rewriteBatchedStatements=true)


allowMultiQueries

允许使用';' 在一个语句中分隔多个查询(真/假)。默认值为“false”,它不影响 addBatch() 和 executeBatch() 方法,它们依赖于 rewriteBatchStatements。

MySQL连接数据库时,添加语句:“allowMultiQueries=true”的作用:

1.可以在sql语句后携带分号,实现多语句执行。
2.可以执行批处理,同时发出多个SQL语句。


sslMode

默认情况下,网络连接是 SSL 加密的;此属性允许关闭安全连接,或选择不同的安全级别。允许以下值: "DISABLED" - 建立未加密的连接;“PREFERRED” - (默认)如果服务器启用加密连接,则建立加密连接,否则回退到未加密连接;"REQUIRED" - 如果服务器启用了安全连接,则建立安全连接,否则失败;"VERIFY_CA" - 与 "REQUIRED" 类似,但另外根据配置的证书颁发机构 (CA) 证书验证服务器 TLS 证书;"VERIFY_IDENTITY" - 像 "VERIFY_CA",

此属性替换了已弃用的旧属性“useSSL”、“requireSSL”和“verifyServerCertificate”,如果“sslMode”未明确设置,这些属性仍被接受但转换为“sslMode”的值:“useSSL=false”被转换为“sslMode=禁用”;{"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"} 被翻译成 "sslMode=PREFERRED"; {"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"} 被翻译成 "sslMode=REQUIRED"; {"useSSL=true" AND "verifyServerCertificate=true"} 被翻译成" “sslMode”的默认设置是“PREFERRED”,相当于传统的“useSSL=true”、“requireSSL=false”和“verifyServerCertificate=false”的设置,与Connector/的默认设置不同J 8.0.12 及更早版本在某些情况下。应审查继续使用旧属性并依赖其旧默认设置的应用程序。“sslMode”的默认设置是“PREFERRED”,相当于传统的“useSSL=true”、“requireSSL=false”和“verifyServerCertificate=false”的设置,与Connector/的默认设置不同J 8.0.12 及更早版本在某些情况下。应审查继续使用旧属性并依赖其旧默认设置的应用程序。在某些情况下为 12 或更早。应审查继续使用旧属性并依赖其旧默认设置的应用程序。在某些情况下为 12 或更早。应审查继续使用旧属性并依赖其旧默认设置的应用程序。

如果显式设置了“sslMode”,则忽略旧属性。如果没有明确设置“sslMode”或“useSSL”,则应用默认设置“sslMode=PREFERRED”。

jdbc 设置关闭安全连接:sslmode=disabled




上一篇:【转】Linux 批量重命名文件的方法
下一篇:discuz 如何限制台湾用户注册,随意发布信息,写法求教。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-2-11 14:04:39 | 显示全部楼层
spring 数据库连接字符串

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-13 16:31:57 | 显示全部楼层
学习学习。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 昨天 08:38 | 显示全部楼层
c# 异常
System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call.
---> MySqlConnector.MySqlException (0x80004005): Authentication method 'caching_sha2_password' failed. Either use a secure connection, specify the server's RSA public key with ServerRSAPublicKeyFile, or set AllowPublicKeyRetrieval=True.


解决方案

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-26 02:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表