2017-02-07 9 views
1

HTTPスレッドをブロックせずに非同期的に最大接続を許可しようとしている、以下の安らかなAPIを作成しました。非同期スレッドからのJava同期データベースマネージャー

@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がアイドル状態であり、唯一までデータベースがそれでは私が作成しようとしていますが待機している状態で新しいスレッドを保持する機能をブロックのいくつかの種類があるエラー「あまりにも多くの接続」

になりいつでも単一のデータベース接続を可能にします。

答えて

2

私には悪いデザインのようなサウンドです。

接続を管理するには、データベース接続プールを使用する必要があります。

接続をチェックアウトして使用し、できるだけ狭い範囲で閉じることが重要です。

トランザクションと分離に細心の注意を払う必要があります。

多くのリクエストを問題なく処理するために、このように使用される単一の接続では一般的です。 10の接続プールを持つ100人の同時ユーザーに対処することができます。

どうすればよいかを確認するには、JDBCTransactionManagerをご覧ください。

スマートな人でもマルチスレッドコードを書くのは難しいです。これは通常、着信要求を管理するためにJava EEアプリケーションサーバー、Netty、またはVert.xに委ねられています。私はその車輪を再発明しないように助言したいと思います。

+0

私は質問を投稿した後、それはそれのようなものになると思いました。私はこれを正しいとマークする前に10分待たなければなりません:) –