Amazon S3是否有连接池?

Mar*_*k_H 18 java amazon-s3 amazon-web-services

我曾经使用过代码

public static AmazonS3Client s3 = null;
...
BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa");
s3 =  new AmazonS3Client(c);
Run Code Online (Sandbox Code Playgroud)

只有一个实例s3被创建,而数十个线程将通过s3.putObject()上传图像.在转储信息中,我可以看到一个线程将锁定唯一的实例s3而其他人正在等待.

所以我想如果我使用下面的代码可能会更快:

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

每次系统将获得随机的s3实例,然后上传图像.

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

但似乎系统变慢了.为什么会这样?也许唯一的实例s3已经使用了连接池?我很迷惑.

小智 32

AWS SDK for Java中的每个客户端(包括Amazon S3客户端)当前都维护着自己的HTTP连接池.您可以通过可以传递到客户端对象构造函数的ClientConfiguration类来调整HTTP连接池的最大大小.

我们建议共享客户端对象,因为有太多的HTTP连接池没有得到有效利用的费用和开销.当你在这样的线程之间共享客户端对象时,你会看到更好的性能.

  • 对于我们当中文化程度较低的人来说...您是说 Mark_H **不应该**创建一系列 S3 客户端吗?您是否建议他应该使用单个 S3 客户端并将其传递给不同的线程? (2认同)