2012-01-17 73 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