gpt4 book ai didi

来自异步线程的 Java 同步数据库管理器

转载 作者:行者123 更新时间:2023-11-29 04:34:52 24 4
gpt4 key购买 nike

我已经创建了以下的 restful API,我试图在不阻塞 HTTP 线程的情况下允许最大异步连接数。

@GET
@Path("sites")
@Produces(value = MediaType.APPLICATION_JSON)
public void getSites(@Suspended AsyncResponse response) {
System.out.println("calling sites");
CompletableFuture
.supplyAsync(() -> DatabaseManager.getInstance().getSites())
.exceptionally(this::handel)
.thenAccept(response::resume);
}

但是,一旦调用DatabaseManager 方法就会出现问题。因为每个 HTTP 连接都会创建一个新线程。这反过来会创建一个到数据库服务器的新数据库连接。

这会导致数据库出现错误“太多连接”

所以我试图创建的是某种阻塞函数,它将新线程保持在等待状态,直到 DatabaseManager 空闲并且在任何时候只允许一个数据库连接。

最佳答案

在我看来这是一个糟糕的设计。

您应该使用数据库连接池来管理连接。

在尽可能小的范围内 check out 、使用和关闭连接很重要。

您需要密切关注事务和隔离。

以这种方式使用的单个连接可以毫无问题地处理许多请求是很常见的。如果操作得当,您可以使用 10 个连接池同时处理 100 个用户。

看看 Spring JDBCTransactionManager 看看它是如何完成的。

即使对于聪明人来说,编写多线程代码也很困难。它通常留给 Java EE 应用程序服务器、Netty 或 vert.x 来管理传入的请求。我建议您不要重新发明那个轮子。

关于来自异步线程的 Java 同步数据库管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100347/

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