【问题标题】:scalatra < squeryl < select ALL | Alwaysscalatra < squeryl < 全选 |总是
【发布时间】:2014-10-17 19:19:06
【问题描述】:

我想从数据库中读取元素并将它们作为 JSON 对象返回。

Scalatra 设置为返回 JSON。 数据库模式已创建。 已添加玩家。

以下代码似乎是主要问题:

get("/") {
  inTransaction {
    List(from(MassTournamentSchema.players)(s => select(s)))
  }
}

我收到以下错误: “没有会话绑定到当前线程,必须通过 Session.create 创建会话并通过 'work' 或 'bindToCurrentThread' 绑定到线程通常当语句在事务/inTrasaction 块之外执行时会发生此错误“

我想正确地做,所以简单地添加诸如“Session.create”之类的东西可能不是正确的方法。

任何人都可以帮助一个scalatra-noob吗? :-)

【问题讨论】:

  • 我认为,问题在于我的设置。我按照 scalatra 网站上的说明获取 JSON 作为标准输出。我的代码返回新创建的列表。但是:http://squeryl.org/selects.html“[...] 查询仅在开始迭代时发送到数据库,或者换句话说,当调用 Iterable.iterator 时。[...]”这可能会自动发生(配置 scalatra 以返回JSON),但在我的情况下,在“inTransaction {...}”块之外 - 最终也在线程之外(?)。有人有想法吗?

标签: scalatra squeryl


【解决方案1】:

我认为您的评论是正确的。 inTransaction 块将 JDBC 连接绑定到线程局部变量并在其上启动连接。如果选择不在同一个线程上发生,您将看到与您收到的错误类似的错误。我建议您尝试以下两件事:

稍后开始您的交易

List(inTransaction {
  from(MassTournamentSchema.players)(s => select(s))
})

我不熟悉 Scalatra 的 List,但它可能会接受一个按名称的参数并稍后在不同的线程上执行它。

强制对查询进行热切评估

inTransaction {
  List(from(MassTournamentSchema.players)(s => select(s)).toList)
}

这里的 .toList 调用将立即将 Squeryl 返回的 Query 对象转换为 Scala 列表,并防止因后续迭代导致的任何惰性求值错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多