如果应用程序试图从不产生结果集的语句中获取结果集,则会发生异常。对于未捕获此类异常的应用程序,Connector/C++ 现在会生成一条信息更丰富的错误消息,以指示异常发生的原因。(缺陷 #28591814,缺陷 #92263)
-
对于使用遗留 JDBC API(即不是 X DevAPI 或 X DevAPI for C)的应用程序,现在可以在创建新会话时指定要尝试的多个主机,直到成功建立连接。可以在会话创建选项中给出主机列表。
为了向后兼容,默认情况下禁用新
OPT_MULTI_HOST
选项,但如果在ConnectionOptionsMap
传递给connect()
调用的参数中启用,它允许其他映射参数指定多个主机。例子:sql::ConnectOptionsMap opts; opts["hostName"]="host1,host2:13001,localhost:13000"; opts["schema"]="test"; opts["OPT_MULTI_HOST"] = true; opts["userName"]="user"; opts["password"]="password"; driver->connect(opts);
sql::ConnectOptionsMap opts; opts["hostName"]="tcp://host1,host2:13001,localhost:13000/test"; opts["OPT_MULTI_HOST"] = true; opts["userName"]="user"; opts["password"]="password"; driver->connect(opts);
sql::ConnectOptionsMap opts; opts["hostName"]="mysql://host1,host2:13001,localhost:13000/test"; opts["OPT_MULTI_HOST"] = true; opts["userName"]="user"; opts["password"]="password"; driver->connect(opts);
端口值是特定于主机的。如果指定的主机没有端口号,则使用默认端口。
这些规则适用:
如果
OPT_MULTI_HOST
禁用并且指定了多个主机,则会发生错误。如果
OPT_MULTI_HOST
禁用并指定解析为多个主机的单个主机,则第一个主机用于向后兼容。如果
OPT_MULTI_HOST
启用并指定了多个主机,则随机选择其中一个作为连接目标。如果目标失败,则从剩余的主机中随机选择另一台主机。如果所有目标都失败,则会发生错误。该
hostName
参数可以接受包含以逗号分隔的主机列表的 URI。URI 方案可以是mysql://
,其工作方式类似于tcp://
。URI 方案也可以省略,因此参数可以是逗号分隔的主机列表。采用 URI、用户和密码参数的
connect()
语法不允许多个主机,因为在那种情况下OPT_MULTI_HOST
被禁用。
-
Connector/C++ 现在与 MSVC 2019 兼容,同时保持与 MSVC 2017 的兼容性:
以前,Connector/C++ 二进制分发与使用 MSVC 2017 或 2015 构建的项目兼容。二进制分发现在与使用 MSVC 2019(使用动态或静态连接器库)或 MSVC 2017(使用动态连接器库)构建的项目兼容。使用 MSVC 2015 构建可能可行,但不受支持。
以前,可以使用 MSVC 2017 或 2015 构建连接器/C++ 源分发。现在可以使用 MSVC 2019 或 2017 构建源分发。使用 MSVC 2015 构建可能有效,但不受支持。
以前,MSI 安装程序接受 Visual C++ Redistributable for Visual Studio 2017 或 2015。MSI 安装程序现在接受 Visual C++ Redistributable for Visual Studio 2019 或 2017。
-
对于 X DevAPI 或用于 C 应用程序的 X DevAPI,Connector/C++ 现在提供了一些选项,可以为 TLS 连接协商指定允许的 TLS 协议和密码套件:
必须从此列表中选择 TLS 协议:TLSv1、TLSv1.1、TLSv1.2、TLSv1.3。(TLSv1.3 要求服务器和连接器/C++ 都使用 OpenSSL 1.1.1 或更高版本进行编译。)
密码套件值必须是 IANA 密码套件名称。
现在可以在这些上下文中指定 TLS 协议和密码套件:
-
连接字符串允许
tls-versions
和tls-ciphersuites
选项。该tls-versions
值是一个或多个以逗号分隔的 TLS 协议版本的列表。该tls-ciphersuites
值是一个或多个以逗号分隔的密码套件名称的列表。例子:...?tls-versions=[TLSv1.3]&... ...?tls-versions=[TLSv1.2,TLSv1.3]&... ...?tls-ciphersuites=[ TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256 ]&...
-
SessionSettings
对象许可TLS_VERSIONS
和TLS_CIPHERSUITES
选项。每个值要么是一个包含一个或多个逗号分隔项的字符串,要么是一个包含字符串的容器(即,可以使用产生字符串值的循环迭代的任何类型)。单个字符串值的示例:
Session s(..., TLS_VERSIONS, "TLSv1.2,TLSv1.3", TLS_CIPHERSUITES, "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256", ...);
字符串容器值示例:
std::list<std::string> tls_versions = { "TLSv1.2", "TLSv1.3" }; std::list<std::string> ciphers = { "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256", "TLS_CHACHA20_POLY1305_SHA256" }; Session s(..., TLS_VERSIONS, tls_versions TLS_CIPHERSUITES, ciphers, ...); Session s(..., TLS_VERSIONS, std::vector{"TLSv1.2","TLSv1.3"}, TLS_CIPHERSUITES, std::vector{"TLS_DHE_PSK_WITH_AES_128_GCM_SHA256", "TLS_CHACHA20_POLY1305_SHA256"}, ...);
-
mysqlx_session_option_set()
和朋友允许MYSQLX_OPT_TLS_VERSIONS
和MYSQLX_OPT_TLS_CIPHERSUITES
会话选项常量,以及相应的OPT_TLS_VERSIONS()
和OPT_TLS_CIPHERSUITES()
宏。MYSQLX_OPT_TLS_VERSIONS
并MYSQLX_OPT_TLS_CIPHERSUITES
接受包含一个或多个逗号分隔项的字符串。例子:mysqlx_session_option_set(opts, ..., OPT_TLS_VERSIONS("TLSv1.2,TLSv1.3"), OPT_TLS_CIPHERSUITES( "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256" ), ...)
有关 MySQL 中的 TLS 协议和密码套件的更多信息,请参阅 加密连接 TLS 协议和密码。(缺陷 #28964583,缺陷 #93299)
-
对于 X DevAPI 或 X DevAPI for C 应用程序,在创建新连接(通过连接字符串或其他方式给出)时,如果连接数据包含多个未分配明确优先级的目标主机,则故障转移逻辑的行为现在是就好像所有这些目标主机都具有相同的优先级一样。也就是说,下一个建立连接的候选者是从剩余的可用主机中随机选择的。
这与之前的行为有所不同,在之前的行为中,没有显式优先级的主机被分配隐式递减优先级,并按照连接数据中列出的相同顺序进行尝试。
-
Connector/C++ 现在支持使用 DNS SRV 记录来指定多个主机:
-
mysqlx+srv://
会话和会话池的创建接受在连接字符串中启用 DNS SRV 功能 的 URI 方案 。例子:mysqlx+srv://_mysql._tcp.host1.example.com/db?options
-
对于 X DevAPI,
mysqlx::Session
对象允许一个SessionOption::DNS_SRV
条目来启用 DNS SRV 记录以指定可用服务。例子:mysqlx::Session sess( SessionOption::HOST, "_mysql._tcp.host1.example.com", SessionOption::DNS_SRV, true, SessionOption::USER, "user", SessionOption::PWD, "password");
同样,对于 C 的 X DevAPI,该
mysqlx_session_option_set()
函数允许OPT_DNS_SRV()
参数列表中的一个选项。例子:mysqlx_session_option_set(opt, OPT_HOST("_mysql._tcp.host1.example.com"), OPT_DNS_SRV(true) OPT_USER("user"), OPT_PWD("password"), PARAM_END));
-
对于使用遗留 JDBC API(即不是 X DevAPI 或 X DevAPI for C)的应用程序,连接映射允许一个
OPT_DNS_SRV
元素。映射应将 SRV 查找的主机指定为完整的查找名称且不带端口。例子:sql::ConnectOptionsMap opts; opts["hostName"] = "_mysql._tcp.host1.example.com"; opts["OPT_DNS_SRV"] = true; opts["userName"] = "user"; opts["password"] = "password"; driver->connect(opts);
在遗留应用程序中,无法在 URI 连接字符串中启用 DNS SRV 解析,因为此类字符串中不支持参数。
-