【问题标题】:Vert.x data access benefits over CompletableFuture.supplyAsync with JDBCVert.x 数据访问优于 CompletableFuture.supplyAsync 与 JDBC
【发布时间】:2020-02-18 09:32:10
【问题描述】:

相对于 CompletableFuture.supplyAsync 使用 vert.x 数据访问库连接到数据库(例如 Reactive PostgreSQL client),在线程管理方面有什么好处。

假设我们有一个 Web 应用程序。 在这两种情况下,请求线程在等待数据库时都不会被阻塞,那么为什么有人会使用 vert.x 驱动而不是官方的jdbc

例如在 JDBC 中:

String url = "jdbc:postgresql://localhost/test";
Properties props = new Properties();
props.setProperty("user","fred");
props.setProperty("password","secret");
props.setProperty("ssl","true");

CompletableFuture.supplyAsync(() -> {
    Connection conn = DriverManager.getConnection(url, props);

    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
    while (rs.next())
    {
        System.out.print("Column 1 returned ");
        System.out.println(rs.getString(1));
    }
    rs.close();
    st.close();
});

在 vert.x 中

PgConnectOptions connectOptions = new PgConnectOptions()
  .setPort(5432)
  .setHost("the-host")
  .setDatabase("the-db")
  .setUser("user")
  .setPassword("secret");

// Pool options
PoolOptions poolOptions = new PoolOptions()
  .setMaxSize(5);

// Create the client pool
PgPool client = PgPool.pool(connectOptions, poolOptions);

// A simple query
client.query("SELECT * FROM users WHERE id='julien'", ar -> {
  if (ar.succeeded()) {
    RowSet<Row> result = ar.result();
    System.out.println("Got " + result.size() + " rows ");
  } else {
    System.out.println("Failure: " + ar.cause().getMessage());
  }

  // Now close the pool
  client.close();
});

【问题讨论】:

    标签: java jdbc java-8 vert.x completable-future


    【解决方案1】:

    确实,在这两种情况下,调用者线程都不会被阻塞。

    但在第一种情况下,任务从池(在您的示例中,JDK 的内部池)中移交给线程,而在第二种情况下,反应式 Pg 客户端异步操作并在结果时调用提供的回调准备好了。

    线程是有代价的(内存、上下文切换)。因此,如果您的应用程序需要以较低的资源处理大量请求,那么 Reactive Pg Client 可能是更好的选择。

    【讨论】:

    • 两种情况下不会发生上下文切换吗?
    • 当然。问题是他们有多少。线程越少,上下文切换就越少。
    • db 访问在所有意义上都是如此重量级的操作,上下文切换是您最不需要关心的事情。
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2016-06-18
    • 2014-07-18
    相关资源
    最近更新 更多