8

我正在尝试利用TypeSafeslick 库与 MySQL 服务器进行交互。所有入门/教程示例都使用withSession{}框架将自动创建会话,在{}'s 中执行查询,然后在块结束时终止会话。

我的程序很健谈,我想在整个脚本执行过程中保持持久连接。到目前为止,我已将这段代码拼凑在一起,以显式创建和关闭会话。

val db = Database.forURL("jdbc:mysql://localhost/sandbox", user = "root", password="***", driver = "com.mysql.jdbc.Driver")
val s = db.createSession()
...
s.close()

我可以在其中执行查询。但是,当我尝试执行命令时,例如

(Qu + "插入 TEST (name) values('"+name+"')").execute

它崩溃是因为它找不到隐式会话。我不完全理解文档中执行定义的语法,但似乎可能有一个可选参数来传递显式会话。我尝试过使用 .execute(s),但这会发出一个警告,即 (s) 在纯表达式中没有做任何事情。

如何明确指定一个预先存在的会话来运行查询?

附: JAB解决方案的试用代码

class ActorMinion(name: String) extends Actor
{
    Database.forURL("jdbc:mysql://localhost/sandbox", user = "root", password="****", driver = "com.mysql.jdbc.Driver") withSession
    {
        def receive =
        {
            case Execute =>
            {
                (Q.u + "insert into TEST (name) values('"+name+"')").execute

                sender ! DoneExecuting(name,output,err.toString)
            }
        }
    }
}

返回编译错误

[错误] /home/ubuntu/helloworld/src/main/scala/hw.scala:41:缺少扩展函数的参数类型

[错误] 匿名函数的参数类型必须是完全已知的。(SLS 8.5)

[错误] 预期的类型是:?

[错误] {

[错误] ^

[错误] 发现一个错误

4

2 回答 2

8

我能够从这个答案中得出我需要的东西

//imports at top of file
//import Database.threadLocalSession <--this should be commented/removed
import scala.slick.session.Session // <-- this should be added
......
//These two lines in actor constructor
val db = Database.forURL("jdbc:mysql://localhost/sandbox", user = "root", password="****", driver = "com.mysql.jdbc.Driver")
implicit var session: Session = db.createSession()
......
session.close() //This line in actor destructor
于 2013-06-04T19:29:07.003 回答
2

只需将脚本的相关部分包含在withSession{}. 请注意,如果您将会话保持打开一段时间/正在执行大量数据库操作查询,您还应该考虑利用事务。

如果数据有潜在的外部来源,你真的应该使用准备好的语句进行插入。

于 2013-06-04T18:45:45.773 回答