私はPlayFrameWorkをSlickで使用しており、すべてI/Oデータベースが重いシステムで使用しています。私のapplication.conf
ファイル私はこの設定をしています:
play {
akka {
akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = WARNING
actor {
default-dispatcher = {
fork-join-executor {
parallelism-factor = 20.0
}
}
}
}
}
これは明らかに、playアプリケーションのコアごとに20スレッドを提供します。私が理解しているように、Slickは独自のスレッドプールを作成します。SlickのNumThreads
フィールドは、それがスレッドの総数であることを意味しますか、それとも( NumThreads x CPU's)?そして、最高のパフォーマンスを得るためのベストプラクティスはありますか?現在、設定を次のように構成しています。
database {
dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
properties = {
databaseName = "dbname"
user = "postgres"
password = "password"
}
numThreads = 10
}
numThreadsは、スレッドプール内の単純なスレッド数です。 Slickは、このスレッドプールを使用してクエリを実行します。
次の設定キーは、組み込みとサードパーティの両方のすべての接続プールでサポートされています:
numThreads(Int、オプション、デフォルト:20):データベースアクションの非同期実行のためのスレッドプール内の同時スレッドの数。スレッドプールの正しいサイズ設定に関する詳細については、HikariCPwikiを参照してください。 Slickでの非同期実行の場合、最大接続プールサイズではなく、それに応じてスレッドプールサイズ(このパラメーター)を調整する必要があることに注意してください。
queueSize(Int、オプション、デフォルト:1000):すべてのスレッドがビジーのときにすぐに実行できないデータベースアクションのキューのサイズ。この制限を超えると、新しいアクションはすぐに失敗します。キューがない場合(直接ハンドオフ)は0に設定し、キューサイズが無制限の場合は-1に設定します(非推奨)。
プールは、デフォルトで非同期実行用に調整されています。接続パラメータとは別に、ほとんどの場合、numThreadsとqueueSizeを設定するだけで済みます。このシナリオでは、接続ではなくスレッドプール(キューを介して)で競合が発生するため、接続の最大数にかなり大きな制限を設けることができます(データベースサーバーが処理できるものに基づいて、ほとんどの場合ではありません効率的)。 Slickは、トランザクション内のデータベース以外のアクションをシーケンス処理するときに、プール内のスレッドよりも多くの接続を使用します。
HikariCPでは次の設定キーがサポートされています:
url(文字列、必須):JDBC URL
driverまたはdriverClassName(String、オプション):ユーザーをロードするJDBCドライバークラス(String、オプション)*:ユーザー名
パスワード(文字列、オプション):パスワード
isolation(String、optional):新しい接続のトランザクション分離レベル。許可される値は、NONE、READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ、SERIALIZABLEです。
catalog(String、optional):新しい接続のデフォルトカタログ。
readOnly(ブール値、オプション):新しい接続の読み取り専用フラグ。
properties(マップ、オプション):ドライバーまたはデータソースに渡すプロパティ。
dataSourceClass(文字列、オプション):JDBCドライバーによって提供されるDataSourceクラスの名前。これは、ドライバーを使用するよりも優先されます。このキーが設定されている場合、urlは無視されることに注意してください(代わりに、プロパティを使用してデータベース接続を構成する必要があります)。
maxConnections(Int、オプション、デフォルト:numThreads * 5):プール内の接続の最大数。
minConnections(Int、オプション、デフォルト:numThreadsと同じ):プールに保持する接続の最小数。
connectionTimeout(期間、オプション、デフォルト:1秒):getConnectionの呼び出しがタイムアウトするまで待機する最大時間。接続が使用可能にならないままこの時間を超えると、SQLExceptionがスローされます。 1000msが最小値です。
validationTimeout(期間、オプション、デフォルト:1秒):接続の有効性がテストされる最大時間。 1000msが最小値です。
idleTimeout(期間、オプション、デフォルト:10分):接続がプール内でアイドル状態を維持できる最大時間。値0は、アイドル状態の接続がプールから削除されないことを意味します。
maxLifetime(期間、オプション、デフォルト:30分):プール内の接続の最大有効期間。アイドル状態の接続がこのタイムアウトに達すると、最近使用された場合でも、プールからリタイアされます。値0は、最大寿命がないことを示します。
connectionInitSql(文字列、オプション):新しい接続が作成されるたびに、プールに追加する前に実行されるSQLステートメント。このSQLが無効であるか、例外をスローした場合、接続障害として扱われ、標準の再試行ロジックに従います。
initializationFailFast(ブール値、オプション、デフォルト:false):プールに初期接続を正常にシードできない場合に、プールを「高速で失敗」させるかどうかを制御します。プールの起動時に接続を作成できない場合、RuntimeExceptionがスローされます。 minConnectionsが0の場合、このプロパティは効果がありません。
leakDetectionThreshold(期間、オプション、デフォルト:0):接続リークの可能性を示すメッセージがログに記録されるまでに接続がプールから出ることができる時間。値0は、リーク検出が無効であることを意味します。リーク検出を有効にするための最小許容値は10秒です。
connectionTestQuery(文字列、オプション):データベースへの接続がまだ有効であることを検証するために、プールから接続が取得される直前に実行されるステートメント。これはデータベースに依存し、データベースによる処理をほとんど必要としないクエリである必要があります(例:「VALUES1」)。設定されていない場合は、代わりにJDBC4 Connection.isValid()
メソッドが使用されます(通常はこれが望ましい)。
registerMbeans(ブール値、オプション、デフォルト:false):JMX管理Bean( "MBeans")が登録されているかどうか。
Slickには、非常に透過的な構成設定があります。優れたパフォーマンスのためのベストプラクティス、経験則はありません。それはあなたのデータベース(いくつの並列接続が提供するか)とあなたのアプリケーションに依存します。データベースとアプリケーション間の調整がすべてです。