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

Java synchronous database manager from asynchronous thread

我已经创建了一个 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 连接都会创建一个新线程。这又会创建一个到数据库服务器的新数据库连接。

这会导致数据库出错"Too many connections"

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

我觉得这是个糟糕的设计。

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

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

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

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

看看 Spring JDBCTransactionManager 看看如何完成。

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