来自异步线程

时间:2017-02-07 21:30:04

标签: java multithreading asynchronous synchronous

我创建了以下的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处于空闲状态,并且只允许单个数据库连接。

1 个答案:

答案 0 :(得分:3)

听起来对我来说是一个糟糕的设计。

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

检查连接,使用它并在尽可能最窄的范围内关闭它是很重要的。

您需要密切关注交易和隔离。

以这种方式使用的单个连接通常可以毫无问题地处理许多请求。如果你做得对,你可以使用10个连接池同时处理100个用户。

查看Spring JDBCTransactionManager,了解如何完成。

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