我想调用一个包含大量数据的数据库,可能需要一段时间才能返回。
我计划在调用Akka.future(f)中完成这项工作,并在工作完成时使用Async {}来呈现响应。
这样做是否有意义,或者我应该只在控制器中进行长数据库调用,而不将工作发送到Akka?
或者有没有办法进行非阻塞数据库访问?
答案 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,它与未来的解决方案非常相似,或者使用非阻塞套接字来节省线程使用。我假设你的意思是前者,在这种情况下,我认为它在功能上等同于使用未来。