2013-05-03 118 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