Akka を使用して JDBC 接続プールを作成しました。
アクターを使用して、実際のデータベース接続の「maxPoolSize」コレクションを保持します。呼び出し元はプール アクターに接続を要求し、 を受け取ります。Future[Connection]
呼び出し元が でプールに戻すまで、接続のステータスは「ビジー」になりますconnection.close
。すべての接続がビジー状態の場合、接続に対する新しい着信要求は待機キューに置かれます (これもプール アクターによって保持されます)。後で接続が返されると、待機中の要求が満たされます。
このロジックの実装は、akka では非常に簡単で、数十行のコードしかありません。ただし、BoneCPマルチスレッド テストを使用してパフォーマンスをテストすると (つまり、呼び出し元は、返されclose
た接続が満たされるとすぐに接続します。すべての要求と結果のベンチマーク)、Akka バージョンは他の多くの接続プールの実装よりも遅いことがわかりました。 tomcat-jdbc、BoneCP、さらにはコモンズ DBCP など。Future[Connection]
getConnection
traversed
close
Await
Future
私がチューニングのために試したこと:
- プール アクターを複数のアクターに分割し、それぞれがすべての実際の接続の一部を保持します
- default-dispatcher 設定パラメータの一部を微調整 (スループット、並列処理)
しかし、顕著な改善は見られませんでした。
私の質問は:
- これは、akka を使用するとパフォーマンスが向上する適切なユース ケースですか?
- そうである場合、これらの手作りのスレッド接続プールの実装と同様またはより優れたベンチマーク データを取得するにはどうすればよいでしょうか?
- そうでない場合、なぜですか?akka をいつ使用するかを決定するのに役立つ確立された基準はありますか?