2016-11-25 7 views
1

私はそうのように、注入によるJDBC接続を取得すると仮定すると、 SQLステートメント(Slick先物に似ています)を実行するときにブロックされないようにしますか?プール内の接続数が多いという事実は、SQL文がブロックされないことを意味しますか?プレイフレームワーク+ JDBC +先物

答えて

2

未来を使うことは、ノンブロッキングと同義ではありません。 Futuresでは、一般的に、別のスレッドまたはあるタイプのエグゼキュータでコードを実行することができます。ただし、実行するコードはブロックされます。

JDBCはブロッキングAPIです。これは、JDBCを介してクエリを実行すると、データベースからの応答を待つ間、呼び出しスレッドがブロックされることを意味します。これの別の用語は、同期です。ノンブロッキングまたは非同期 APIは非同期的に応答を受け取り、呼び出し側のスレッドをアクティブに待たずに解放します。 Reactive slickは独自のドライバを使用してデータベースからの応答を非同期で受け取ります。つまり、クエリがデータベースに送出されるとすぐに呼び出しスレッドを解放できます。

2つの違いはこれです:

さんがあなたのJDBCの全てが先物に呼び出しをラップするとしましょう、あなたのアプリケーションは、その後、サイズ100のデータベース接続プール、およびサイズ10の固定スレッドプールを持っている想像してみて。コントローラSqlQueryに複数のJDBC呼び出しを同時に行うメソッドがあるとしましょう。これらのクエリはすべて、スレッドプールが使い果たされるまで並列に実行されます。つまり、任意の時点で同時に10個のクエリしか実行できないことを意味します。呼び出し元スレッドはJDBC呼び出しによってブロックされませんが、呼び出しスレッドはそれらを実行します。十分なクエリが並行して実行されると、スレッドプールが使い果たされ、プール内にいくつの接続があったかはもはや問題になりません。スレッドプールを大きくするか、必要に応じて展開するフォーク結合プールを使用することでこれに対処できますが、新しいスレッドの作成やコンテキスト切り替えによるパフォーマンスコストが発生する可能性があります。結局のところ、あなたのCPUは限られています。

リアクティブ・スリックのような非同期データベース・ドライバーを使用すると、限られたスレッド・プールがブロックされず、プール内の接続(この例では100個)と同じ数の照会を同時に実行できます。スレッドがブロックされないようにするということは、応答を待っているだけのCPU時間を節約できるということです。他のリクエストの処理を続けるために使用できます。

+0

[Slick plain SQL queries ](http://slick.lightbend.com/doc/3.1.0/sql.html)を使用していますか? – ps0604