hakobera's blog

技術メモ。たまに雑談

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 で実装される予定の機能をバックポートして使っています。

メモがわりにその方法を書いておきます。

注意点

  • データソースを複数管理するところまでしかやっていません
    • なぜなら Doma を使っていて、JPA を使っていないから
  • JPA も上記 branch では対応しているので、できるはず(未検証)

706 チケットの修正ブランチをみつける

mbknor/play at lighthouse-706-patch · GitHub

差分ファイルを取ってくる(JPAの部分は除く)

面倒なので gist に貼っておきました。これをまとめて plugins パッケージのおいてください。
play.plugins は app フォルダ直下においてください。

https://gist.github.com/1716464

設定ファイルを書き換える

この書式は 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);
	}

}

以上です。