数据库查询(JDBC)的专用执行上下文总是一个好主意吗



我正在创建一个连接关系数据库(Amazon RDS(的播放应用程序。

对数据库进行查询的逻辑被封装在Future中用于异步执行。

为查询设置一个专用的执行上下文,使其与应用程序使用的上下文分离,会带来任何性能提升吗?如果是,为什么?

是。在正常情况下,这是处理此类问题的首选方式。

默认情况下,Play用于处理请求的线程池的默认大小为机器的内核数。为了从Play用于处理请求的执行上下文中获得最佳性能,您的操作处理程序代码需要是:

无阻塞且计算速度快的

这是因为,任何阻塞操作或计算成本高昂的调用都需要更多的时间来执行。一些阻塞请求阻塞了线程池,使得没有线程可用于处理较新的请求。在负载更高的情况下,情况会变得更糟,因为在这种情况下,您可能希望返回给用户一些消息,而不是用户等待太久才得到结果(因为所有线程都忙于为以前的调用提供服务(。

假设在一台4核机器上,如果您的操作处理程序阻止了一个调用(执行需要10秒(。如果有超过4个并发http请求,则服务器将无法处理新请求(直到执行前4个请求(,即使机器在计算上利用不足。理想情况下,服务器可以承担更多的负载。

因此,动作处理程序代码应该以一种特殊的方式编写,以获得最佳效果。

假设您使用与Play用于其请求处理线程池的执行上下文相同的执行上下文,用于数据库调用。一些昂贵的数据库调用会阻塞执行上下文,使线程无法处理请求。

最新更新