我有控制器的方法,由于数据库查询非常慢,阻止Play服务器线程。我需要以不阻塞线程的方式实现控制器方法。 我已阅读文档:http://www.playframework.org/documentation/1.2.4/asynchronous
在任何地方都没有关于如何做到这一点的例子。我发现的唯一一件事是https://github.com/playframework/play/blob/master/samples-and-tests/chat/app/controllers/LongPolling.java 它只是将结果包装在await();
中当我尝试这样做时,它不起作用。
路线:
GET /blog Controller.blog
控制器(这不是一个实际的慢速查询,但其他一切都是相同的):
public static void blog() {
String queryStr = "SELECT b FROM Blog b ORDER BY createTime DESC";
JPAQuery q = Blog.find(queryStr);
List<Blog> bList = q.fetch(100);
List<BlogDTO> list = new ArrayList<BlogDTO>(bList.size());
for (Blog b : bList) {
BlogDTO obj = new BlogDTO(b);
list.add(obj);
}
renderJSON(list);
}
我尝试了List<Blog> bList = await(q.fetch(100));
,但这不起作用。
我以前没有和Future和承诺合作过。 任何人都可以给我任何关于如何处理这个问题的指示吗?
答案 0 :(得分:0)
由于JDBC使用阻塞IO,因此任何慢速数据库查询都将始终阻止线程。 唯一的方法似乎是为此目的使用Job。
答案 1 :(得分:0)
对我来说,最好的方法是使用一个返回List对象的Job。然后在您的控制器中,您可以等待作业终止:
public static void blog() {
List<BlogDTO> list = await(new BlogPostJob().now());
renderJSON(list);
}
你把你的jpa代码放在你的工作中