2012-01-17 48 views
1

在Play文档有这个例子:Play Framework:如何创建和使用连接池?

public class AsyncTest extends Controller { 

    public static void remoteData() { 
    F.Promise<WS.HttpResponse> r1 = WS.url("http://example.org/1").getAsync(); 
    F.Promise<WS.HttpResponse> r2 = WS.url("http://example.org/2").getAsync(); 
    F.Promise<WS.HttpResponse> r3 = WS.url("http://example.org/3").getAsync(); 

    F.Promise<List<WS.HttpResponse>> promises = F.Promise.waitAll(r1, r2, r3); 

    // Suspend processing here, until all three remote calls are complete. 
    List<WS.HttpResponse> httpResponses = await(promises); 

    render(httpResponses); 
    } 
} 

在上面的例子是在3个新HTTP连接example.org,正确?

有什么办法可以在启动时创建一个连接池,然后从该池中获取并重新使用连接,而不是反复创建和拆除连接?理想情况下,我可以有多个连接池,例如,一个HTTP连接池,一个数据库连接池等。我该怎么做?

谢谢。

回答

1

在你的例子中,你没有获得连接,你得到了HttpResponses,它是你在给定URL上发出的特定GET请求的答案。由于您使用的API是与连接无关的,因此底层框架可以创建3个单独的连接,或者它可以为所有3重用单个连接,并且您应该得到相同的答案。

我不知道框架在底层做了什么,但我敢打赌它很不错。

import play.jobs.Job; 
import play.jobs.OnApplicationStart; 

@OnApplicationStart 
public class InitializeConnectionPool extends Job { 
    @Override 
    public void doJob() { 
     //initialize your connection pools here, storing them in a static variable 
    } 
} 
+0

感谢:

不过,如果你想手动建立一套应用程序启动(?也许TCP连接工作节点)的资源,你可以如下图所示初始化在应用程序启动任何东西。因此,如果我将连接存储在一个静态变量中,如何确保它是多线程访问该变量以获取连接并返回连接的线程安全? – Continuation 2012-01-17 09:42:10

+0

使用synchronize(object){}可以显式同步任何对象(无论它是否来自静态变量)请参见[here](http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync .html)提醒。 – 2012-01-17 09:55:06

+0

由于性能方面的原因,HTTP连接池通常很有用(例如HttpClient默认使用它:http://hc.apache.org/httpcomponents-client-4.2.x/tutorial/html/connmgmt.html#d5e463) – 2014-10-13 07:56:05

相关问题