Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 播放框架+;JDBC&x2B;期货_Scala_Playframework_Slick_Slick 3.0 - Fatal编程技术网

Scala 播放框架+;JDBC&x2B;期货

Scala 播放框架+;JDBC&x2B;期货,scala,playframework,slick,slick-3.0,Scala,Playframework,Slick,Slick 3.0,假设我通过注入获得JDBC连接,如下所示: class SqlQuery @Inject()(db: Database) extends Controller { /* .... */ } 并且连接池足够大,例如100个。在运行SQL语句时,是否可以创建一个未来来避免阻塞(类似于Slick futures)?或者,池中的连接数很大这一事实意味着SQL语句不会阻塞?使用futures并不是非阻塞的同义词。一般来说,未来允许您在另一个线程或某种类型的执行器上执行代码。但是,您执行的代码仍然可以

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

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

并且连接池足够大,例如100个。在运行SQL语句时,是否可以创建一个未来来避免阻塞(类似于Slick futures)?或者,池中的连接数很大这一事实意味着SQL语句不会阻塞?

使用futures并不是非阻塞的同义词。一般来说,未来允许您在另一个线程或某种类型的执行器上执行代码。但是,您执行的代码仍然可以阻塞

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

两者的区别在于:

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


使用像reactiveslick这样的异步数据库驱动程序将不会阻塞有限的线程池,并且您将能够并发运行与池中连接数量相同的查询(本例中为100)。将线程从阻塞中解救出来意味着节省了CPU时间,否则这些时间将只用于等待响应,这意味着您可以使用它来继续处理其他请求等。

这是否意味着运行比JDBC查询更好,因为Slick不会阻塞?