Amazon S3 是否有连接池?

2022-09-02 01:03:46

我曾经使用过代码

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 已经使用了连接池?我很困惑。


答案 1

适用于 Java 的 AWS 开发工具包中的每个客户端(包括 Amazon S3 客户端)当前都维护自己的 HTTP 连接池。可以通过可传递到客户端对象构造函数的 ClientConfiguration 类来调整 HTTP 连接池的最大大小。

我们建议共享客户端对象,因为有太多未得到有效利用的 HTTP 连接池会产生费用和开销。在此类线程之间共享客户端对象时,应该会看到更好的性能。


答案 2

推荐