才刚开始玩。文档讨论了如何异步运行Play。
但是如何在异步运行Play时运行MySQL查询呢?正常的MySQL查询是阻塞的,对吗?所以这是行不通的。
Node.js有自己的非阻塞MySQL客户端就是为了这个目的,但是我找不到任何类似的客户端。
如何在异步播放应用程序中运行MySQL查询?
发布于 2011-12-26 15:36:56
播放作业在单独的线程中执行,并释放主http线程。然后,当Job (包装在Promise对象中)在完成后返回时,主http线程从它停止的位置启动。
因此,主http线程不会被阻塞,并可用于处理其他传入的http请求。
发布于 2012-05-01 04:12:31
通常,对DB的SQL调用的执行通常是阻塞的,并按顺序执行。Play对异步执行有很好的支持,可以提高你的应用程序的性能。
Play 2.0的工作代码示例
public static Result slow() {
Logger.debug("slow started");
// Start execution
Promise<DataObject> userObject1 = SlowQuery.getUser(440);
Promise<DataObject> userObject2 = SlowQuery.getCategory(420);
// ... here execution is already in progress ...
// Map to Promise Objects
Promise<DataObject> res1 = userObject1.map(new Function<DataObject, DataObject>() {
public DataObject apply(DataObject res) {
Logger.debug("Got result (userObject1): " + res.toString());
return res;
}
});
Promise<DataObject> res2 = userObject2.map(new Function<DataObject, DataObject>() {
public DataObject apply(DataObject res) {
Logger.debug("Got result (userObject2): " + res.toString());
return res;
}
});
// here we wait for completion - this blocks
userObject1.getWrappedPromise().await();
userObject2.getWrappedPromise().await();
// the result is available
Logger.debug(res1.get().toString());
Logger.debug(res2.get().toString());
Logger.debug("slow finished");
return ok("done");
}
使用社区维基功能可以随意改进--我相信有些部分可以缩短。
https://stackoverflow.com/questions/8632714
复制相似问题