我想在我們的Play 2.1應用程序中添加第二個臨時數據庫(基於文件H2)。但無法弄清楚如何以及在哪裏爲第二個數據庫創建一個Squeryl模式。如何在Play中爲兩個不同的數據庫定義Squeryl模式
第一個模式已經在擴展org.squeryl.Schema的scala類中定義。我應該在哪裏放置第二個數據庫的表格定義?
感謝您的任何提示。
我想在我們的Play 2.1應用程序中添加第二個臨時數據庫(基於文件H2)。但無法弄清楚如何以及在哪裏爲第二個數據庫創建一個Squeryl模式。如何在Play中爲兩個不同的數據庫定義Squeryl模式
第一個模式已經在擴展org.squeryl.Schema的scala類中定義。我應該在哪裏放置第二個數據庫的表格定義?
感謝您的任何提示。
我沒有用播放,所以你可能需要調整這個局面一點得到它的工作,但你應該能夠爲該數據庫中創建一個新的會話,是這樣的:
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模式所必需的。
@jcem - 謝謝。我的問題是關於創建第二個模式並將該模式綁定到第二個數據庫,而不是關於會話。我有點想出會議部分。無論如何,爲每個H2查詢創建一個新的Session是否是一個好習慣?我應該更好地將其緩存在某處(例如在Play Cache中)? – alboko
對不起,我可能已經理解了。你是否想在現有的數據庫上創建第二個模式 - 比如:db.schema1.tablename和db.schema2.tablename,或者你是否希望將第二個獨立的數據庫與現有數據庫一起使用?如果是後者,那麼我發佈的內容將適用。如果前者,那麼你在正確的軌道上 - 你只需要導入Squeryl Schema和查詢您的表定義(只需注意命名空間衝突)。這個問題似乎提到了兩個單獨的數據庫,這就是爲什麼我回答我的方式。 – jcern
@jcem:後者 - 一個單獨的數據庫以及現有的數據庫。第二個數據庫應該有一個完全不同的模式。我仍然不知道如何告訴Squeryl爲第二個DB使用另一個「Schema」類。 – alboko
除了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())
}
}
...
}
挖四周,我發現谷歌Squeryl組中的提示:https://groups.google.com/forum/#!topic/squeryl/kdUmp1-hOmA - 我想我需要創建不同的Schema類並重寫Schema.name屬性。仍然不知道如何告訴Squeryl哪個模式用於DB – alboko