Documentation Home
MySQL 连接器/ODBC 发行说明  / MySQL 连接器/ODBC 版本 8.0 中的更改  /  MySQL Connector/C++ 8.0.19 的变化(2020-01-13,正式发布)

MySQL Connector/C++ 8.0.19 的变化(2020-01-13,正式发布)

错误处理

  • 如果应用程序试图从不产生结果集的语句中获取结果集,则会发生异常。对于未捕获此类异常的应用程序,Connector/C++ 现在会生成一条信息更丰富的错误消息,以指示异常发生的原因。(缺陷 #28591814,缺陷 #92263)

遗留 (JDBC API) 注释

  • 对于使用遗留 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 注释

  • 对于 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-versionstls-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_VERSIONSTLS_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_VERSIONSMYSQLX_OPT_TLS_CIPHERSUITES会话选项常量,以及相应的 OPT_TLS_VERSIONS()OPT_TLS_CIPHERSUITES()宏。 MYSQLX_OPT_TLS_VERSIONSMYSQLX_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条目来启用 D​​NS 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 解析,因为此类字符串中不支持参数。

修正错误

  • 连接器/C++ 无法在 Linux 上使用 Clang 进行编译。(缺陷号 30450484)

  • 连接器/C++ 将事务隔离级别设置 REPEATABLE READ为连接时,无论当前服务器设置如何。(错误#22038313、错误#78852、错误#30294415)