Play Framework で複数データベースに接続する方法
Play Framework 1.2.4 では、標準の機能で複数データベースに接続することができません。
ただし、希望としては上がっていて、実は 1.3 では実装される予定です。
#706 Multiple database/JPA support - Play framework 1.0 (now in maintenance mode) - play
しかし、現在のプロジェクトでどうしても複数のデータベースに接続する必要がある要件があったので、1.3 で実装される予定の機能をバックポートして使っています。
メモがわりにその方法を書いておきます。
706 チケットの修正ブランチをみつける
差分ファイルを取ってくる(JPAの部分は除く)
面倒なので gist に貼っておきました。これをまとめて plugins パッケージのおいてください。
play.plugins は app フォルダ直下においてください。
設定ファイルを書き換える
この書式は 1.3 になっても使えるはずなので、バージョンアップも安心ですね。
# デフォルトDB db.url=${DB_URL} db.driver=oracle.jdbc.driver.OracleDriver db.user=${DB_USER} db.pass=${DB_PASS} # 2個目のDB db_other.url=${OTHER_DB_URL} db_other.driver=org.postgresql.Driver db_other.user=${OTHER_DB_USER} db_other.pass=${OTHER_DB_PASS}
"db_" の後に任意の文字列を指定する。この文字列が DB を特定する ID となります。
上記で言うと、"other" が ID となります。
Doma から使う
DB.datasource を DB.getDBConfig("ID").getDataSource() に変更します。
DB.getDBConfig("play").getDataSource() だとデフォルトDBが取得できます。
public class ReportDBConfig extends DomaAbstractConfig { protected static final LocalTransactionalDataSource dataSource = createDataSource(); static JdbcLogger jdbcLogger = defaultJdbcLogger(); protected static final Dialect dialect = new PostgreasDialect(); @Override public DataSource getDataSource() { return dataSource; } @Override public Dialect getDialect() { return dialect; } @Override public JdbcLogger getJdbcLogger() { return jdbcLogger; } protected static LocalTransactionalDataSource createDataSource() { return new LocalTransactionalDataSource(DB.getDBConfig("other").getDatasource()); } public static LocalTransaction getLocalTransaction() { return dataSource.getLocalTransaction(jdbcLogger); } }
以上です。