Squeryl会话管理与'使用'

时间:2011-12-05 22:10:57

标签: scala squeryl

我正在学习Squeryl并尝试理解'使用'语法但无法找到文档。

在以下示例中,创建了两个数据库,A包含单词 Hello ,B包含 Goodbye 。目的是查询A的内容,然后附加单词 World 并将结果写入B.

预期的控制台输出是插入的消息(2,HelloWorld)

object Test {
    def main(args: Array[String]) {
        Class.forName("org.h2.Driver");
        import Library._

        val sessionA = Session.create(DriverManager.getConnection(
                "jdbc:h2:file:data/dbA","sa","password"),new H2Adapter)
        val sessionB = Session.create(DriverManager.getConnection(
                "jdbc:h2:file:data/dbB","sa","password"),new H2Adapter)

        using(sessionA){
            drop; create
            myTable.insert(Message(0,"Hello"))
        }
        using(sessionB){
            drop; create
            myTable.insert(Message(0,"Goodbye"))
        }

        using(sessionA){
            val results = from(myTable)(s => select(s))//.toList

            using(sessionB){
                results.foreach(m => {
                    val newMsg = m.copy(msg = (m.msg+"World"))
                    myTable.insert(newMsg)
                    println("Inserted "+newMsg)
                })
            }
        }
    }

    case class Message(val id: Long, val msg: String) extends KeyedEntity[Long]
    object Library extends Schema { val myTable = table[Message] }
}

目前,代码打印插入消息(2,GoodbyeWorld),除非在 val结果的末尾添加 toList >行。

是否有某种方法可以将结果查询绑定到使用 sessionA ,即使在使用(sessionB)中进行评估时也是如此?这似乎比使用 toList 强制查询评估并将内容存储在内存中更好。

更新

感谢Dave Whittaker的回答,以下片段修复了它而没有使用'toList'并纠正了我对'使用'和查询运行的理解。

val results = from(myTable)(s => select(s))

using(sessionA){            
    results.foreach(m => {
        val newMsg = m.copy(msg = (m.msg+"World"))
        using(sessionB){myTable.insert(newMsg)}
        println("Inserted "+newMsg)
    })
}

1 个答案:

答案 0 :(得分:3)

首先,我为缺乏文件而道歉。 using()构造是一个新功能,仅在SNAPSHOT构建中可用。我实际上昨天和Max谈到了早期采用者的一些文档问题,我们正在努力解决这些问题。

我无法想到将特定会话绑定到查询。看看你的例子,看起来简单的解决方法就是颠倒你的交易。当您创建查询时,Squeryl实际上并不访问数据库,它只是创建一个表示要执行的SQL的AST,因此您不需要在此时发出使用(sessionA)。然后,当您准备迭代结果时,可以将查询调用包装在嵌套在using(sessionB)中的using(sessionA)中。这有意义吗?