Scala Akka中流畅的数据库会话、效率和线程

Scala Akka中流畅的数据库会话、效率和线程,scala,akka,slick,Scala,Akka,Slick,我目前正在处理一个非常大的数据库(>50GB),并试图了解最有效、可用的方法,该方法可以很好地利用Akka的固有线程 关于“用session{}包装所有内容”的方法,虽然这是一个更容易的修复方法,但我担心这会限制Akka在参与者之间的线程。我不太了解Akka的线程是如何工作的,以及如何将整个演员系统包装在withSession中会对其产生影响 另一种方法是在访问数据库时使用Session调用,这太低效了。“withSession{”代码段需要~6ms才能执行,我们正在进行数百万次查询 本质上:使

我目前正在处理一个非常大的数据库(>50GB),并试图了解最有效、可用的方法,该方法可以很好地利用Akka的固有线程

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

另一种方法是在访问数据库时使用Session调用,这太低效了。“withSession{”代码段需要~6ms才能执行,我们正在进行数百万次查询

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


我听说过使用隐式会话和事务的方法,但我很难找到这两种方法的相关文档。

迟做总比不做好:


建议使用jdbc连接池(例如c3p0)。您需要确保从同一线程中获取并返回会话。
withSession
从池中懒洋洋地获取连接,并在作用域结束时返回连接。在需要时快速获取连接,然后立即返回到池中。

请参阅以获取一些建议。如何准确地获取连接您将ExecutionContext与会话连接?或者最好的解决方案是将所有数据库访问代码放在与其他ExecutionContext不同的ExecutionContext下吗?一种方法可能是将按需会话与连接池结合使用,以减少采集开销。请参阅例如。(我是该连接池的作者,所以我被它吸引了。理论上,在akka世界中,应该有使用参与者管理的连接的聪明解决方案。但是维护长寿命、可重用的CXN在实践中并不重要。现有的连接池可以做到这一点。ymmv!)+1用于每个@SteveWaldman的池。连接池消除了创建和删除连接的重大成本,并且可以对应用程序的其他部分透明地完成,这些应用程序只看到withSession,而不关心底层连接是否已可用。这提供了一个用于slick的读写池。