我想在我们的Play 2.1应用程序中添加第二个临时数据库(基于文件的H2)。但无法弄清楚如何以及在何处为第二个DB创建Squeryl架构。
第一个模式已在扩展org.squeryl.Schema的scala类中定义。我应该在哪里为第二个DB提供表定义?
感谢任何提示。
答案 0 :(得分:1)
我没有使用Play,所以你可能需要稍微调整一下才能使它工作,但你应该能够为该数据库创建一个新会话,如:
object MySecondDBSchema extends SquerylSchema with SchemaDefaults {
def newSession[A](f: => A) = {
transaction(new org.squeryl.Session(//get java.sql.Connection, new H2Adapter)) {
f
}
}
val myTable = table[MyTable]
}
或者,如果您只是想要一个连接并计划自己处理交易。
def newSession[A](f: => A) = {
using(new org.squeryl.Session(//get java.sql.Connection, new H2Adapter)) {
//start your own transaction
f
}
}
然后在您的代码中,当您想要访问其他数据库时,您可以将查询包装在:
中def myMethodToAccessFirstDB() = {
import MySecondDBSchema._
newSession{
//access alternate database
from(myTable)(t => select(t)).toList
}
}
def myMethodToAccessDefaultDB() = {
import DefaultSchema._ //Or whatever your default Schema is named
//access default database
from(otherTable)(ot => select(ot))
}
在扩展org.squeryl.Schema
的第二个对象中定义和组织表是合乎逻辑的,但在newSession
块中进行的任何查询都将针对第二个数据库执行。
至于覆盖name
属性,这将更改默认schema in the database,但不是创建单独的Squeryl架构所必需的。
答案 1 :(得分:0)
除了jcern回答:不要忘记关闭连接。 我的变种:
object MySecondDBSchema extends Schema {
var ds : DataSource = _
def newSession[A](f: => A) = {
var conn: Option[Connection] = None
try {
conn = Some(ds.getConnection)
val proxyConn = conn.map {
case a : ArraySupportProxyConnection => a
case c : C3P0ProxyConnection => new ArraySupportProxyConnection(c)
}.get
using[A](new org.squeryl.Session(proxyConn, new AwesomePostgreSqlAdapter)) {
inTransaction {
f
}
}
}
finally {
conn.foreach(_.close())
}
}
...
}