【问题标题】:Slick Database Sessions, Efficiency, and Threading in AkkaAkka 中的 Slick 数据库会话、效率和线程
【发布时间】:2013-07-06 03:22:44
【问题描述】:

我目前正在处理一个非常大的数据库 (>50GB),并试图了解与 Akka 固有线程完美配合的最有效、最实用的方法。

关于“将所有内容包装在 withSession{ } 中”的方法,虽然这会更容易解决,但我担心这会限制 Akka 在参与者之间的线程。我不太了解 Akka 的线程是如何工作的,以及将整个演员系统包装在 withSession 中会如何影响它。

另一种方法是在访问数据库时调用withSession,效率太低。 “withSession {”代码段需要大约 6 毫秒的时间来执行,我们正在进行数百万次查询。

本质上:在不中断线程的情况下,使用 Slick 和 Akka 快速访问数据库的最佳方法是什么?

我听说过使用隐式会话和事务的方法,但我很难找到关于其中任何一个的文档。

【问题讨论】:

  • 请参阅this answer 以获得一些建议。
  • 如何将 ExecutionContext 与 Sessions 接口?或者最好的解决方案是简单地将所有数据库访问代码放在与其他代码不同的 ExecutionContext 下?
  • 一种方法可能是将 withSession 按需与连接池结合使用,以减少获取开销。参见例如fernandezpablo85.github.io/2013/04/07/… (我是那个连接池的作者,所以我倾向于它。理论上,在 akka 世界中,应该有聪明的解决方案与参与者管理的连接。但维护长期的、可重用的 cxns 在练习。现有的池可以做到。ymmv!)
  • +1 用于每个 @SteveWaldman 的池化。连接池消除了创建和删除连接的巨大成本 - 并且可以对只看到 withSession 并且不关心底层连接已经可用的应用程序的其余部分透明地完成
  • 这提供了一个与 slick 一起使用的读写池。 github.com/privateblue/asyncpools

标签: scala akka slick


【解决方案1】:

迟到总比不到好:

推荐的方法是使用 jdbc 连接池(例如 c3p0)。您需要确保从同一线程中获取和返回会话。 withSession 懒惰地从池中获取连接并在作用域结束时返回它。在需要时快速获取连接,然后立即将它们返回到池中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多