gpt4 book ai didi

java - Vert.x 数据访问优于使用 JDBC 的 CompletableFuture.supplyAsync

转载 作者:行者123 更新时间:2023-12-01 19:29:17 26 4
gpt4 key购买 nike

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

假设我们有一个 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();
});

最佳答案

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

但是在第一种情况下,任务被移交给池中的线程(在您的示例中,是 JDK 的内部池),而在第二种情况下,Reactive Pg Client 异步操作,并在结果出现时调用提供的回调准备好了。

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

关于java - Vert.x 数据访问优于使用 JDBC 的 CompletableFuture.supplyAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60277677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com