Slick 3.0.0 documentation - 04 Database Configuration
Permalink to Database Configuration — Slick 3.0.0 documentation
どのようにしてデータベースへ接続するかを、Databaseオブジェクトを通してSlickに教えてあげなくてはならない。slick.jdbc.JdbcBackend.Database オブジェクトを作成するためのfactory methodsがいくつかある。
PlayやAkkaで使われてるapplication.conf
に、Typesafe Configでデータベースに接続する設定を記述する方法を我々は推奨している。
mydb = {
dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
properties = {
databaseName = "mydb"
user = "myuser"
password = "secret"
}
numThreads = 10
}
Database.forConfig を用いて、設定を読み込むことができる。引数などの詳細についてはAPI documentationを見て欲しい。
val db = Database.forConfig("mydb")
JDBC URLはforURLに渡してあげる(URLについては各種利用するデータベースのJDBCドライバのドキュメントを読んで欲しい)。
val db = Database.forURL("jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1", driver="org.h2.Driver")
ここでは、JVMが終了するまで使うことの出来るtest1
という名前の、空のインメモリH2データベースへの情報を記述し、接続を作成している(DB_CLOSE_DELAY=-1
ってのはH2データベース特有の設定だ)。
DataSourceはforDataSourceに渡してあげる。これは、アプリケーションフレームワークのコネクションプールから得られたものを、Slickのプールへと繋げている。
val db = Database.forDataSource(dataSource: javax.sql.DataSource)
もしJNDIを使っているのならば、DataSourceオブジェクトを見つけられるように、JNDIの名前をforNameへ渡してあげたら良い。
val db = Database.forName(jndiName: String)
どのDatabase
もスレッドプールを管理するAsyncExecutorを保持している。このスレッドプールはデータベースのI/O Actionを非同期に実行するためのものである。そのサイズは、Database
オブジェクトが最も良いパフォーマンスを出せるよう調整すべき重要なパラメータとなる。この値には、非同期アプリケーションで利用していた コネクションプール数 を設定すべきである(HikariCPのAbout Pool Sizingなどのドキュメントも参考にして欲しい)。Database.forConfigを用いると、スレッドプールは、直接外部の設定からコネクションパラメータなどと一緒に設定する事が出来る。もしDatabase
を取得するのに、その他のファクトリーメソッドを用いているのなら、デフォルトの設定をそのまま用いるか、AsyncExecutor
をカスタマイズして利用して欲しい。
val db = Database.forURL("jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1", driver="org.h2.Driver",
executor = AsyncExecutor("test1", numThreads=10, queueSize=1000))
コネクションプールを用いているのなら(プロダクション環境などでは利用していると思うが…)、コネクションプール数の最小値は少なくとも先のと同じ数を設定すべきである。コネクションプール数の最大値については、同期的なアプリケーションにおいて利用される数より多めの値を設定するのが良い。スレッドプール数を超えるコネクションは、データベースセッションをオープンし続けるために、他のコネクションが要求された際に用いられたりする(e.g. トランザクション中の非同期的な計算結果を待っている時など)。
ちなみに、Database.forConfigを利用した際には、スレッドプール数を基に計算されたコネクションプール数がデフォルト値として提供されることになる。
Slickはプリペアドステートメントを利用可能な場所では利用しているものの、Slick側でそれらをキャッシュしたりはしていない。それゆえ、あなた自身でコネクションプールの設定時に、プリペアドステートメントのキャッシュを有効化して欲しい。
Database
の設定のトップにおいて、DatabaseConfigのフォーム内にSlickドライバに合うDatabase
を追加する設定も置くことが出来る。これを利用すると、異なるデータベースを利用する際に、簡単に設定ファイルを変更出来るようにするための抽象化が簡単に出来る。
driver
にSlickのドライバを、db
にデータベースの設定を記述したDatabaseConfig
の例は次のようになる。
tsql {
driver = "slick.driver.H2Driver$"
db {
connectionPool = disabled
driver = "org.h2.Driver"
url = "jdbc:h2:mem:tsql1;INIT=runscript from 'src/main/resources/create-schema.sql'"
}
}