playframework1からh2dbを使う場合、同梱されていることもあり超簡単に設定できる。
# インメモリDBの場合
db.default=mem
# 以下と等価。
# db.default.driver=org.h2.Driver
# db.default.url=jdbc:h2:mem:play;MODE=MYSQL
# db.default.user=sa
# db.default.pass=
# ファイルシステムDBの場合
db.default=fs
# 以下と等価。
# db.default.driver=org.h2.Driver
# db.default.url=jdbc:h2:${application.path}/db/h2/play;MODE=MYSQL
# db.default.user=sa
# db.default.pass=
細かくオプションを指定したい場合は、driver / url / user / passの項目に展開した状態で、下記のようにurl設定に手を加える。
db.url=jdbc:h2:${application.path}/db/h2/play;MODE=MYSQL;MVCC=TRUE;AUTO_SERVER=TRUE
db.driver=org.h2.Driver
db.user=sa
db.pass=
MVCC
MVCC=TRUE
とすることでマルチバージョン制御が有効となり同時書き込みに対応するようになる。ただし書き込み速度が犠牲になる。
MVCCは1.4.177Beta以降はデフォルトでONになっているそうだ。
PageStore方式の1.3ではデフォルトでOFF。十分に試験されていないとの注釈あり。
MVStore方式の1.4ではデフォルトでON。
MVCC設定もデフォルトではMV_STORE設定と同じ値になるため、これもデフォルトで有効となる。テストのため、これらの設定は
Version 1.4.177 Beta (2014-04-12) – H2Databaseを追っかけていたりしたブログ (hatenablog.com)";MV_STORE=FALSE"
や";MVCC=FALSE"
をデータベースURLに追記する事で無効化する事が出来る。
playframework1ではplay1.2.7.2ではh2-1.3.166を。play1.3.1ではh2-1.4.185が同梱されている。play1.3より前でマルチバージョン制御ONで使うのであれば、MVCC=TRUE
指定が必要ということ。
AUTO_SERVER
AUTO_SERVER=TRUE
とすると、組込モードでも複数のプロセスから同一のファイルDBへアクセスできるようになる。同じ接続文字列を使うこと。
DBファイルへアクセスできるのであればプロセスは同一PCである必要はない。
内部動作としては最初の接続は組込モードで起動し、さらにサーバがデーモンスレッドで起動する。
もしDBが別プロセスによって開かれているときは組込モードは使用せずサーバ接続を行う。サーバのIPアドレスやポートの情報は.lock.dbファイルに書かれているのでそれを使う。(そのためインメモリDBの場合は使用できない)
最初に接続するプロセスは組込モードでアクセスするので高速に動作する。
起動するサーバ使用するポートはランダム生成。
通常のサーバモードは配下のディレクトリにあるどのDBにもアクセス可能だが、AUTO_SERVER動作ではこのDBしかアクセスできない。
最初に接続したプロセスが終了するとサーバも停止する。が、まだ接続が開かれている場合はその中の誰かがサーバを起動する。このサーバ停止のタイミングで開いているトランザクションはロールバックする。
サーバ/クライアントはH2がすべて解決するためユーザは介入できない。唯一使用するポートについては AUTO_SERVER_PORT
で指定できる。
複数の接続からアクセスする場合はサーバモードで起動するのが安全安心な方法だが、堅牢性を多少犠牲にしてもよいのであれば、AUTO_SERVERモードは使い勝手もよく便利そうだ。
例えば、アプリケーションAは常に起動していてDBを使う。アプリケーションBはたまに起動してDBを使う。このようなケースであればサーバ停止時のロールバックも無視できるため最適。
MV_STORE=FALSE
旧ストレージエンジン(PageStore方式)のみを使用する。
MVStore方式を使用するとDBファイルサイズが大きくなってしまう。これを抑制したいときに指定する。
If you want to use PageStore, the older storage engine, add
Connection string for using MVStore (google.com)
;MV_STORE=FALSE
to your database URL