Deletions are marked like this. | Additions are marked like this. |
Line 24: | Line 24: |
前者は何とでもなる。後者については、@Finallyアノテーションを付けたメソッドのなかでThreadLocalに保存されたConnectionを廃棄(するなり初期化するなり)すればよい。 {{{ @Finally def finallyProc = { Logger.info("clean-up") } } }}} |
anormで複数DBへのアクセス
自前のjava.sql.Connection
play frameworkは、基本的にconf/application.confに記述されたデータベースに対して自動的なアクセスを提供するようだが、これでは「あらかじめ決められたただ一つのDB」へのアクセスしかできない。 playの将来バージョンでは、この記述が複数認められるようになる模様であるが、しかし実行時にDBを自由に切り替えるというわけにはいかないようだ。
しかし、Anorm.scalaのソースを読んでみるとわかるのだが、実はアプリ側で任意のjava.sql.Connectionを用意してやりさえすれば、そこにアクセスすることは簡単にできる。例えば、
val clients = SQL("select * from clients order by id")().map(row => .....
と記述すると、デフォルトのデータベースに対するアクセスになるが、これに自前のjava.sql.Connectionを指定することにより、
val clients = SQL("select * from clients order by id")(connection).map(row => .....
そのデータベースへのアクセスとなる。
自前のjava.sql.Connectionの管理
ただし、自前のjava.sql.Connectionを扱うためには、次の二点をクリアしなければならない。
- 一つのリクエスト・レスポンスサイクルの中で、一つのConnectionを使い回したいと思われるので、それをキャッシュする仕組みが必要。
- レスポンスが終了したらそれをクローズするか、あるいは再利用のための準備をする必要がある。
前者は何とでもなる。後者については、@Finallyアノテーションを付けたメソッドのなかでThreadLocalに保存されたConnectionを廃棄(するなり初期化するなり)すればよい。
@Finally def finallyProc = { Logger.info("clean-up") } }