我曾经使用过代码
public static AmazonS3Client s3 = null;
...
BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa");
s3 = new AmazonS3Client(c);
只有一个实例s3被创建,而数十个线程将通过s3.putObject()上传图像。在转储信息中,我可以看到一个线程将锁定唯一的实例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已经使用了连接池?我很困惑。
答案 0 :(得分:30)
AWS SDK for Java中的每个客户端(包括Amazon S3客户端)当前都维护着自己的HTTP连接池。您可以通过the ClientConfiguration class调整HTTP连接池的最大大小,该大小可以传递给客户端对象构造函数。
我们建议共享客户端对象,因为有太多的HTTP连接池没有得到有效利用的费用和开销。当您在这样的线程之间共享客户端对象时,您应该会看到更好的性能。