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がいくつかある。

Using Typesafe Config 

PlayAkkaで使われてる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")

Using a JDBC URL 

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データベース特有の設定だ)。

Using a DataSource 

DataSourceforDataSourceに渡してあげる。これは、アプリケーションフレームワークのコネクションプールから得られたものを、Slickのプールへと繋げている。

val db = Database.forDataSource(dataSource: javax.sql.DataSource)

Using a JNDI Name 

もしJNDIを使っているのならば、DataSourceオブジェクトを見つけられるように、JNDIの名前をforNameへ渡してあげたら良い。

val db = Database.forName(jndiName: String)

Database thread pool 

どのDatabaseもスレッドプールを管理するAsyncExecutorを保持している。このスレッドプールはデータベースのI/O Actionを非同期に実行するためのものである。そのサイズは、Databaseオブジェクトが最も良いパフォーマンスを出せるよう調整すべき重要なパラメータとなる。この値には、非同期アプリケーションで利用していた コネクションプール数 を設定すべきである(HikariCPAbout 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))

Connection pools 

コネクションプールを用いているのなら(プロダクション環境などでは利用していると思うが…)、コネクションプール数の最小値は少なくとも先のと同じ数を設定すべきである。コネクションプール数の最大値については、同期的なアプリケーションにおいて利用される数より多めの値を設定するのが良い。スレッドプール数を超えるコネクションは、データベースセッションをオープンし続けるために、他のコネクションが要求された際に用いられたりする(e.g. トランザクション中の非同期的な計算結果を待っている時など)。

ちなみに、Database.forConfigを利用した際には、スレッドプール数を基に計算されたコネクションプール数がデフォルト値として提供されることになる。

Slickはプリペアドステートメントを利用可能な場所では利用しているものの、Slick側でそれらをキャッシュしたりはしていない。それゆえ、あなた自身でコネクションプールの設定時に、プリペアドステートメントのキャッシュを有効化して欲しい。

DatabaseConfig 

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'"
  }
}
Fork me on GitHub