2014-01-19 47 views
0

我想在我們的Play 2.1應用程序中添加第二個臨時數據庫(基於文件H2)。但無法弄清楚如何以及在哪裏爲第二個數據庫創建一個Squeryl模式。如何在Play中爲兩個不同的數據庫定義Squeryl模式

第一個模式已經在擴展org.squeryl.Schema的scala類中定義。我應該在哪裏放置第二個數據庫的表格定義?

感謝您的任何提示。

+0

挖四周,我發現谷歌Squeryl組中的提示:https://groups.google.com/forum/#!topic/squeryl/kdUmp1-hOmA - 我想我需要創建不同的Schema類並重寫Schema.name屬性。仍然不知道如何告訴Squeryl哪個模式用於DB – alboko

回答

1

我沒有用播放,所以你可能需要調整這個局面一點得到它的工作,但你應該能夠爲該數據庫中創建一個新的會話,是這樣的:

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模式所必需的。

+0

@jcem - 謝謝。我的問題是關於創建第二個模式並將該模式​​綁定到第二個數據庫,而不是關於會話。我有點想出會議部分。無論如何,爲每個H2查詢創建一個新的Session是否是一個好習慣?我應該更好地將其緩存在某處(例如在Play Cache中)? – alboko

+0

對不起,我可能已經理解了。你是否想在現有的數據庫上創建第二個模式 - 比如:db.schema1.tablename和db.schema2.tablename,或者你是否希望將第二個獨立的數據庫與現有數據庫一起使用?如果是後者,那麼我發佈的內容將適用。如果前者,那麼你在正確的軌道上 - 你只需要導入Squeryl Schema和查詢您的表定義(只需注意命名空間衝突)。這個問題似乎提到了兩個單獨的數據庫,這就是爲什麼我回答我的方式。 – jcern

+0

@jcem:後者 - 一個單獨的數據庫以及現有的數據庫。第二個數據庫應該有一個完全不同的模式。我仍然不知道如何告訴Squeryl爲第二個DB使用另一個「Schema」類。 – alboko

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()) 
    } 
    } 

    ... 
} 
相關問題