8.2. Eclipse Vert.x JDBC 客户端的更改


从 Eclipse Vert.x 4 中,JDBC 客户端支持 SQL 客户端。SQL common 模块也已合并到 JDBC 客户端中,即 io.vertx:vertx-sql-common 合并于 io.vertx:vertx-client 模块。您必须删除 io.vertx:vertx-sql-common 依赖项文件,因为 io.vertx:vertx-jdbc-client 将包含它。通过合并 SQL 通用客户端,所有数据库 API 都已合并到 JDBC 客户端中。

在 Eclipse Vert.x 4 中,SQL 客户端已被更新,使其包含以下客户端:

  • 重新主动 PostgreSQL 客户端。在较早版本的中,它包括了被动 PostgreSQL 客户端。
  • 重新主动 MySQL 客户端
  • 重新主动 DB2 客户端
  • 继续包括被动 PostgreSQL 客户端。这个客户端也包括在 Eclipse Vert.x 3.x 版本中。
  • 现有的 JDBC 客户端现在同时包含 JDBC 客户端 API 和 SQL 客户端 API

被动实施使用数据库网络协议。这使得资源效率更高。

对数据库的 JDBC 调用将阻止调用。JDBC 客户端使用 worker 线程来使这些调用非阻塞。

以下部分介绍了 Eclipse Vert.x JDBC 客户端中的更改。

8.2.1. 创建池

在 Eclipse Vert.x 4 中,您可以使用 JDBC 客户端 API 创建池。在早期版本中,您只能创建客户端。您不能创建池。

以下示例演示了如何在 Eclipse Vert.x 3.x 中创建客户端。

// 3.x
SQLClient client = JDBCClient.create(vertx, jsonConfig);

以下示例演示了如何在 Eclipse Vert.x 4 中创建池。

// 4.x
JDBCPool pool = JDBCPool.pool(vertx, jsonConfig);
注意

虽然 Eclipse Vert.x 3.x API 在 Eclipse Vert.x 4 中被支持,但建议您使用应用程序中的新的 JDBC 客户端 API。

池允许您执行简单的查询。您不需要管理简单查询的连接。但是,对于复杂的查询或多个查询,您必须管理您的连接。

以下示例演示了如何管理 Eclipse Vert.x 3.x 中的查询的连接。

// 3.x
client.getConnection(res -> {
  if (res.succeeded()) {
    SQLConnection connection = res.result();
    // Important, do not forget to return the connection
    connection.close();
  } else {
    // Failed to get connection
  }
});

以下示例演示了如何管理 Eclipse Vert.x 4 中的查询连接。

// 4.x
pool
  .getConnection()
  .onFailure(e -> {
    // Failed to get a connection
  })
  .onSuccess(conn -> {
    // Important, do not forget to return the connection
    conn.close();
  });

8.2.2. 支持 Typsesafe 配置

您可以使用 jsonConfig 进行配置。但是,使用 jsonConfig 有时可能会导致错误。为避免这些错误,JDBC 客户端引入了 Typesafe Config。

以下示例显示了 Typesafe Config 的基本结构。

// 4.x ONLY!!!
JDBCPool pool = JDBCPool.pool(
      vertx,
      // configure the connection
      new JDBCConnectOptions()
        // H2 connection string
        .setJdbcUrl("jdbc:h2:~/test")
        // username
        .setUser("sa")
        // password
        .setPassword(""),
      // configure the pool
      new PoolOptions()
        .setMaxSize(16)
    );
注意

要使用 Typesafe Config,您必须在项目中包含 agroal 连接池。该池不公开许多配置选项,并使配置易于使用。

8.2.3. 运行 SQL 查询

本节演示了如何在 JDBC 客户端中运行查询。

8.2.3.1. 运行一个 shot 查询

以下示例演示了如何在 Eclipse Vert.x 3.x 中在不管理连接的情况下运行查询。

// 3.x
client.query("SELECT * FROM user WHERE emp_id > ?", new JsonArray().add(1000), res -> {
  if (res.succeeded()) {
    ResultSet rs = res2.result();
    // You can use these results in your application
  }
});

以下示例演示了如何在 Eclipse Vert.x 4 中运行查询,而不管理连接。

// 4.x
pool
  .preparedQuery("SELECT * FROM user WHERE emp_id > ?")
  // the emp id to look up
  .execute(Tuple.of(1000))
  .onSuccess(rows -> {
    for (Row row : rows) {
      System.out.println(row.getString("FIRST_NAME"));
    }
  });

8.2.3.2. 在受管连接上运行查询

以下示例演示了如何在 Eclipse Vert.x 4 中对受管连接运行查询。

pool
  .getConnection()
  .onFailure(e -> {
    // Failed to get a connection
  })
  .onSuccess(conn -> {
    conn
      .query("SELECT * FROM user")
      .execute()
      .onFailure(e -> {
        // Handle the failure
        // Important, do not forget to return the connection
        conn.close();
      })
      .onSuccess(rows -> {
        for (Row row : rows) {
          System.out.println(row.getString("FIRST_NAME"));
        }
        // Important, do not forget to return the connection
        conn.close();
      });
  });

8.2.4. 支持存储的步骤

存储的步骤在 JDBC 客户端中受到支持。

以下示例演示了如何在 Eclipse Vert.x 3.x 中传递 IN 参数。

// 3.x
connection.callWithParams(
  "{ call new_customer(?, ?) }",
  new JsonArray().add("John").add("Doe"),
  null,
  res -> {
    if (res.succeeded()) {
      // Success!
    } else {
      // Failed!
    }
  });

以下示例演示了如何在 Eclipse Vert.x 4 中传递 IN 参数。

// 4.x
client
  .preparedQuery("{call new_customer(?, ?)}")
  .execute(Tuple.of("Paulo", "Lopes"))
  .onSuccess(rows -> {
    ...
  });

在 Eclipse Vert.x 3.x 中,由于可用类型,将 INOUT 参数结合使用的支持会非常有限。在 Eclipse Vert.x 4 中,池是安全的,可以处理 INOUT 参数的组合。您还可以在应用程序中使用 INOUT 参数。

以下示例显示了在 Eclipse Vert.x 3.x 中处理参数。

// 3.x
connection.callWithParams(
  "{ call customer_lastname(?, ?) }",
  new JsonArray().add("John"),
  new JsonArray().addNull().add("VARCHAR"),
  res -> {
    if (res.succeeded()) {
      ResultSet result = res.result();
    } else {
      // Failed!
    }
});

以下示例显示了在 Eclipse Vert.x 4 中处理参数。

// 4.x
client
  .preparedQuery("{call customer_lastname(?, ?)}")
  .execute(Tuple.of("John", SqlOutParam.OUT(JDBCType.VARCHAR)))
  .onSuccess(rows -> {
    ...
  });

在 JDBC 客户端中,数据类型已更新。

  • 对于类型为 OUT 的参数,您可以指定其返回类型。在示例中,OUT 参数指定为 类型 VARCHAR,这是 JDBC 常量。
  • 这类类型不受 JSON 限制的限制。现在,您可以在类型名称中使用数据库特定类型而不是文本常量。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.