繁体   English   中英

播放框架+ JDBC +期货

[英]Play Framework + JDBC + Futures

假设我通过注入获得了JDBC连接,如下所示:

class SqlQuery  @Inject()(db: Database) extends Controller  { /* .... */ }

并且连接池足够大,例如100。是否可以创建Future来避免在运行SQL语句时发生阻塞(类似于Slick Futures)? 还是池中的连接数很大意味着SQL语句不会阻塞?

使用期货并不等同于非阻塞。 通常,使用期货,您可以在另一个线程或某种类型的执行程序上执行代码。 但是,您执行的代码仍会阻塞。

JDBC是一个阻塞API。 这意味着,当您通过JDBC执行查询时,调用线程在等待数据库响应时被阻塞。 另一个术语是同步的 非阻塞或异步 API会异步接受响应,从而使调用线程免于主动等待。 Reactive slick使用它自己的驱动程序以异步方式接受数据库的响应,这意味着只要将查询分派到数据库,就可以释放调用线程。

两者之间的区别是:

想象一下,您的应用程序有一个大小为100的数据库连接池和一个大小为10的固定线程池。然后,假设您将所有JDBC调用包装在将来。 还要说您的SqlQuery控制器有一个可以同时进行多个JDBC调用的方法。 所有这些查询将并行运行,直到线程池耗尽为止,这意味着您将只能在任何给定时刻同时运行10个查询。 虽然调用线程不会被JDBC调用阻止,但是执行它们的线程会阻止。 如果有足够多的并行查询运行,则线程池将耗尽,并且池中的连接数不再重要。 您可以通过增大线程池或使用根据需要扩展的派生联接池来解决此问题,但是由于创建新线程和上下文切换,这可能会导致性能损失。 毕竟,您的CPU是有限的。

使用像active slick这样的异步数据库驱动程序不会阻塞您有限的线程池,并且您将能够同时运行与池中有连接的情况一样多的查询(在此示例中为100)。 避免线程被阻塞意味着节省CPU时间,否则这些CPU时间将仅用于等待响应,这意味着您可以使用它来继续处理其他请求等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM