Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Playframework SQL访问是否在Play框架中阻塞?_Playframework_Playframework 2.0 - Fatal编程技术网

Playframework SQL访问是否在Play框架中阻塞?

Playframework SQL访问是否在Play框架中阻塞?,playframework,playframework-2.0,Playframework,Playframework 2.0,我可能误解了Play Framework(2.x)的一些基本内容,但是关于访问普通SQL数据库的文档和访问普通SQL数据库的项目示例似乎都不是异步的 没有承诺,没有阿克卡之类的东西 如果您使用普通的MySQL JDBC驱动程序进行数据库查询,您是否没有阻塞主服务器线程?我遗漏了什么?AFAIK,如果您正在查看“计算机数据库”示例,您完全正确,它会阻止主线程,因为操作不是异步执行的 以下是摘录自: 这里,Computer.page()正在执行一些JDBC阻塞调用 如果希望异步执行,则应将数据库调用

我可能误解了Play Framework(2.x)的一些基本内容,但是关于访问普通SQL数据库的文档和访问普通SQL数据库的项目示例似乎都不是异步的

没有承诺,没有阿克卡之类的东西


如果您使用普通的MySQL JDBC驱动程序进行数据库查询,您是否没有阻塞主服务器线程?我遗漏了什么?

AFAIK,如果您正在查看“计算机数据库”示例,您完全正确,它会阻止主线程,因为操作不是异步执行的

以下是摘录自:

这里,
Computer.page()
正在执行一些JDBC阻塞调用

如果希望异步执行,则应将数据库调用包含在
async(F.Promise)
调用中。大概是这样的:

public static Result list(int page, String sortBy, String order, String filter) {
    return async(
            Akka.future(
                new Callable<Result>() {
                  public Result call() {
                    return ok(
                        list.render(
                            Computer.page(page, 10, sortBy, order, filter),
                            sortBy, order, filter
                        )
                    );
                  }
                }
        )
    );
ResultSet results = connection.execute(query);
公共静态结果列表(int页、字符串排序、字符串顺序、字符串筛选器){
异步返回(
阿克卡,未来(
新的可调用(){
公共结果调用(){
返回ok(
list.render(
计算机页面(第10页,排序、顺序、过滤器),
下流的,下流的
)
);
}
}
)
);

}

是的,db驱动程序会阻止一个线程,等待来自数据库的结果

即使像ico_ekito建议的那样在Akka将来封装JDBC调用,它仍然会在整个数据库请求期间阻塞一个服务器线程。这样做可能只会在另一个线程上执行调用(取决于Akka决定如何执行),但它仍然会阻塞该线程

唯一正确的解决方法是使用非阻塞数据库驱动程序

顺便说一句,您可以很容易地发现阻塞db驱动程序。如果其界面看起来像这样:

public static Result list(int page, String sortBy, String order, String filter) {
    return async(
            Akka.future(
                new Callable<Result>() {
                  public Result call() {
                    return ok(
                        list.render(
                            Computer.page(page, 10, sortBy, order, filter),
                            sortBy, order, filter
                        )
                    );
                  }
                }
        )
    );
ResultSet results = connection.execute(query);
这肯定是阻塞。 您可以通过返回未来、承诺(具有写端的未来)或回调的方法来识别非阻塞API

还请注意,没有“主”服务器线程(如浏览器/桌面应用程序中的UI线程)。只有几个线程处理请求


要进行更深入的讨论,请查看。

嗯。我不确定我是否理解您的答案。没有“主服务器线程”?不是吗?所有的请求都在同一个线程上进行?(如node.js等)因此,如果执行任何阻塞io,所有客户端都必须等待。正如@MartinKonicek所指出的,传入请求并不是只有一个线程。它由核心或剧本使用的阿克卡演员管理。默认配置在此处可用:Ok。这就是我最初误解的原因。然后我理解了为什么普通的JDBC访问看起来像是在阻止所有客户端,但事实并非如此。非常感谢你们两位。我意识到让我困惑的一件事是文档中的内容:“由于Play 2.0的工作方式,动作代码必须尽可能快(即非阻塞)。”好的。伟大的谢谢你的回答。仍然不明白为什么他们在文档和示例中没有这样做。您不能/真的不应该阻止主请求/事件循环,这不是重点吗?