使用“使用”的 Squeryl 会话管理

Posted

技术标签:

【中文标题】使用“使用”的 Squeryl 会话管理【英文标题】:Squeryl session management with 'using' 【发布时间】:2011-12-05 22:10:57 【问题描述】:

我正在学习 Squeryl 并试图理解“使用”语法,但找不到关于它的文档。

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

预期的控制台输出是 Inserted Message(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] 

就目前而言,代码打印 Inserted Message(2,GoodbyeWorld),除非在 val 结果的末尾添加 toList > 线。

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

更新

感谢 Dave Whittaker 的回答,下面的 sn-p 修复了它而不诉诸“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】:

首先,对于缺少文档,我深表歉意。 using() 构造是仅在 SNAPSHOT 构建中可用的新功能。实际上,我昨天与 Max 讨论了一些针对早期采用者的文档问题,我们正在努力解决这些问题。

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

【讨论】:

Dave,感谢您在 Squeryl 上所做的所有努力,这改变了我对 ORM 的看法并坚定了我对 Scala 的承诺。我很惊讶 using() 应该只在快照中,因为我确定我只是将罐子从网站上拉下来。用你的解决方案更新了我的问题,这真的澄清了事情。

以上是关于使用“使用”的 Squeryl 会话管理的主要内容,如果未能解决你的问题,请参考以下文章

会话管理

使用Cookie进行会话管理

HTTP会话的使用与管理

我想使用 Next-Auth 实现会话管理系统

javaweb学习总结——使用Cookie进行会话管理(转载)

JavaWeb---总结使用Cookie进行会话管理