Play Framework + JDBC + Futures
Play Framework + JDBC + Futures
假设我通过注入获得一个JDBC连接,像这样:
class SqlQuery @Inject()(db: Database) extends Controller { /* .... */ }
并且连接池足够大,例如 100。是否可以创建 Future 以避免在 运行 SQL 语句时阻塞(类似于 Slick futures)?还是说池中的连接数很大,意味着SQL语句不会阻塞?
使用期货并不等同于非阻塞。通常,Futures 允许您在另一个线程或某种类型的执行程序上执行代码。但是,您执行的代码仍然会阻塞。
JDBC 是阻塞 API。这意味着当您通过 JDBC 执行查询时,调用线程在等待数据库响应时被阻塞。另一个术语是 同步。非阻塞或 asynchronous API 将异步接受响应,从而使调用线程免于主动等待它。 Reactive slick 使用它自己的驱动程序以异步方式接受来自数据库的响应,这意味着一旦将查询分派到数据库,就可以释放调用线程。
两者的区别是:
假设您的应用程序有一个大小为 100 的数据库连接池和一个大小为 10 的固定线程池。然后,假设您将所有 JDBC 调用包装在 futures 中。假设您的 SqlQuery
控制器有一个方法可以同时进行多个 JDBC 调用。所有这些查询都将 运行 并行,直到线程池耗尽,这意味着您在任何给定时刻只能同时 运行 10 个查询。虽然调用线程不会被 JDBC 调用阻塞,但执行它们的线程会。如果有足够多的并行查询 运行ning,线程池就会耗尽,池中有多少连接将不再重要。您可以通过扩大线程池或使用根据需要扩展的分支连接池来解决此问题,但这可能会因创建新线程和上下文切换而产生性能成本。毕竟你的CPU是有限的
使用像 reactive slick 这样的异步数据库驱动程序不会阻塞您有限的线程池,并且您可以 运行 并发查询与池中的连接数一样多(本例中为 100 个) .避免线程被阻塞意味着节省 CPU 时间,否则这些时间将花费在等待响应上,这意味着您可以使用它来继续处理其他请求等。
假设我通过注入获得一个JDBC连接,像这样:
class SqlQuery @Inject()(db: Database) extends Controller { /* .... */ }
并且连接池足够大,例如 100。是否可以创建 Future 以避免在 运行 SQL 语句时阻塞(类似于 Slick futures)?还是说池中的连接数很大,意味着SQL语句不会阻塞?
使用期货并不等同于非阻塞。通常,Futures 允许您在另一个线程或某种类型的执行程序上执行代码。但是,您执行的代码仍然会阻塞。
JDBC 是阻塞 API。这意味着当您通过 JDBC 执行查询时,调用线程在等待数据库响应时被阻塞。另一个术语是 同步。非阻塞或 asynchronous API 将异步接受响应,从而使调用线程免于主动等待它。 Reactive slick 使用它自己的驱动程序以异步方式接受来自数据库的响应,这意味着一旦将查询分派到数据库,就可以释放调用线程。
两者的区别是:
假设您的应用程序有一个大小为 100 的数据库连接池和一个大小为 10 的固定线程池。然后,假设您将所有 JDBC 调用包装在 futures 中。假设您的 SqlQuery
控制器有一个方法可以同时进行多个 JDBC 调用。所有这些查询都将 运行 并行,直到线程池耗尽,这意味着您在任何给定时刻只能同时 运行 10 个查询。虽然调用线程不会被 JDBC 调用阻塞,但执行它们的线程会。如果有足够多的并行查询 运行ning,线程池就会耗尽,池中有多少连接将不再重要。您可以通过扩大线程池或使用根据需要扩展的分支连接池来解决此问题,但这可能会因创建新线程和上下文切换而产生性能成本。毕竟你的CPU是有限的
使用像 reactive slick 这样的异步数据库驱动程序不会阻塞您有限的线程池,并且您可以 运行 并发查询与池中的连接数一样多(本例中为 100 个) .避免线程被阻塞意味着节省 CPU 时间,否则这些时间将花费在等待响应上,这意味着您可以使用它来继续处理其他请求等。