2013-05-03 129 views
13

我曾經使用過,而幾十個線程將被s3.putObject上傳圖片Amazon S3是否有連接池?

public static AmazonS3Client s3 = null; 
... 
BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa"); 
s3 = new AmazonS3Client(c); 

只有一個實例S3 IS創建的代碼()。在轉儲信息中,我可以看到一個線程會鎖定唯一的實例s3而其他人正在等待。

所以我想也許這將是更快,如果我使用下面的代碼:

BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa"); 
for(int i = 0; i < 10; i++) 
    amazonS3[i] = new AmazonS3Client(c); 

每次系統會獲得一個隨機S3實例,然後上傳圖片。

private static AmazonS3 getS3(){ 
    int i = (int)(Math.random() * 10); 
    return amazonS3[i]; 
} 

但似乎系統變慢了。爲什麼會發生? 也許唯一的實例s3已經使用連接池?我很困惑。

回答

27

適用於Java的AWS開發工具包(包括Amazon S3客戶端)中的每個客戶端當前都維護着它自己的HTTP連接池。您可以通過the ClientConfiguration class調整HTTP連接池的最大大小,這可以傳遞給客戶端對象構造函數。

我們建議共享客戶端對象,因爲有太多的HTTP連接池沒有得到有效利用的開銷和開銷。在跨線程共享客戶端對象時,應該會看到更好的性能。

+0

感謝您的幫助。你是對的。 – 2013-05-08 05:20:53

+1

因爲我們中的文化程度較低......你是說Mark_H **不應該**製作S3客戶端陣列嗎?你是否建議他應該使用單個S3客戶端並將其傳遞給不同的線程? – mmcrae 2015-02-02 22:14:13

+0

你指的是這裏的setMaxConnections方法,我猜? – rogerdpack 2015-07-23 20:48:22

相關問題