Play& Akka和阻塞线程进行数据库访问

时间:2012-09-28 20:30:49

标签: scala playframework-2.0 akka nonblocking

我想调用一个包含大量数据的数据库,可能需要一段时间才能返回。

我计划在调用Akka.future(f)中完成这项工作,并在工作完成时使用Async {}来呈现响应。

这样做是否有意义,或者我应该只在控制器中进行长数据库调用,而不将工作发送到Akka?

或者有没有办法进行非阻塞数据库访问?

3 个答案:

答案 0 :(得分:4)

如果您被迫为数据库使用阻塞驱动程序(如果出于某种原因,MySQL的异步驱动程序无效)请考虑使用PinnedDispatcher设置Actor池(使用路由)。

PinnedDispatcher为每个actor提供一个线程,通过设置路由器,您可以调整严格负责处理数据库调用的线程数。易于扩展。此外,通过使用Actors,您可以更轻松地构建actor之间的消息(例如,具有数据库调用结果的消息)。

答案 1 :(得分:2)

您可以使用Akka.future(f)并提供自己的Akka配置文件,以获取更多线程来处理您的数据库访问。例如,请查看this config file

但是你指出了:真正的问题是使用阻塞的数据库驱动程序。我不知道你使用的是哪个数据库,但是值得看看带有ReactiveMongo的MongoDB。使用ReactiveMongo,所有MongoDB操作都是完全非阻塞和异步的。有一个很好的介绍here。此外,它与Play Framework非常匹配(请查看ReactiveMongo Play Plugin)。

编辑:您还可以检查“Configuring Playframework's internal Akka system”以调整工作线程数。

答案 2 :(得分:1)

如果响应在数据库调用完成时被阻止,那么只有在调用运行时可以完成其他工作以组合响应时,才能使其异步。

非阻塞数据库访问可能意味着一些不同的东西:一个客户端库,它为您提供基于回调的API,它与未来的解决方案非常相似,或者使用非阻塞套接字来节省线程使用。我假设你的意思是前者,在这种情况下,我认为它在功能上等同于使用未来。