Liftから複数のDBに接続する。

Scala+Lift 関連目次

前回、Oracleへの接続ができたので、今回はOracleとMysqlに繋いでモデルごとに接続先のDBを定義してみる。

接続設定

例によってpropsにOracleとmysqlの接続設定を書く。

[code] oracle.db.driver=oracle.jdbc.driver.OracleDriver
oracle.db.url=jdbc:oracle:thin:@HOST:1521:SID
oracle.db.user=USER
oralce.db.password=PASSWORD

mysql.db.driver=com.mysql.jdbc.Driver
mysql.db.url=jdbc:mysql://HOST/DBNAME?user=USER&password=PASSWORD
[/code]

コネクション取得処理

bootsrap.liftweb.Boot.scala にコネクションを取得する処理を書く。

このときにOracle, Mysql それぞれに ConnectionIdentifier も定義する。

[code language="scala"] object OracleConnectionIdentifier extends ConnectionIdentifier {
override def jndiName = "oracle" }

object OracleVendor extends ConnectionManager {
def newConnection(name: ConnectionIdentifier): Box[Connection] = { try { Class.forName(Props.get("oracle.db.driver") openTheBox) val dm = DriverManager.getConnection( Props.get("oracle.db.url") openTheBox, Props.get("oracle.db.user") openTheBox, Props.get("oracle.db.password") openTheBox) Full(dm) } catch { case e: Exception => e.printStackTrace; Empty } } def releaseConnection(conn: Connection) { conn.close } }

object MysqlConnectionIdentifier extends ConnectionIdentifier {
override def jndiName = "mysql" }

object MysqlVendor extends ConnectionManager {
def newConnection(name: ConnectionIdentifier): Box[Connection] = { try { Class.forName(Props.get("mysql.db.driver") openTheBox) val dm = DriverManager.getConnection(Props.get("mysql.db.url") openTheBox) Full(dm) } catch { case e: Exception => e.printStackTrace; Empty } } def releaseConnection(conn: Connection) { conn.close } } [/code]

Boot.scala の boot関数でOracle, MysqlのConnectionIdentifierを登録する。

[code language="scala"] def boot { if (!DB.jndiJdbcConnAvailable_?) { DB.defineConnectionManager(OracleConnectionIdentifier, OracleVendor) DB.defineConnectionManager(MysqlConnectionIdentifier, MysqlVendor) } [/code]

Mavenへのドライバ設定も忘れずに

pom.xml に以下を追加

[code language="xml"] <dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.8</version> </dependency> [/code]

Modelに接続先DBの設定を追加する

あとは、Model を定義するときに dbDefaultConnectionIdentifier をオーバーライドして、利用するConnectionIdentifierを定義するだけ。

[code language="scala"] package info.ukikusa.model {
import root.net.liftweb.mapper._ import root.net.liftweb.util._ import root.net.liftweb.common._ import root.bootstrap.liftweb._

object User extends User with MetaMegaProtoUser[User] { override def dbDefaultConnectionIdentifier = OracleConnectionIdentifier override def dbTableName = "users" override def fieldOrder = List(id, firstName, lastName, email, locale, timezone, password, textArea) }

class User extends MegaProtoUser[User] { def getSingleton = User object textArea extends MappedTextarea(this, 2048) { override def textareaRows = 10 override def textareaCols = 50 override def displayName = "Personal Essay" } } } [/code]