0

データベースクエリが非常に遅いため、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と一緒に仕事をしたことがなく、前に約束しました。誰かが私にこれにアプローチする方法についての指針を与えることができますか?

4

2 に答える 2

0

JDBCはブロッキングIOを使用するため、遅いデータベースクエリは常にスレッドをブロックします。唯一の方法は、その目的でJobを使用することのようです。

于 2012-07-09T10:35:28.197 に答える
0

私にとってこれを行う最良の方法は、Listオブジェクトを返すジョブを使用することです。次に、コントローラーでジョブの終了を待つことができます:

public static void blog() {
    List<BlogDTO> list = await(new BlogPostJob().now());
    renderJSON(list);
}

そしてあなたはあなたのjpaコードをあなたの仕事に入れます

于 2012-07-09T10:36:38.937 に答える