Java AmazonS3有连接池吗?

Java AmazonS3有连接池吗?,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我用过密码吗 public static AmazonS3Client s3 = null; ... BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa"); s3 = new AmazonS3Client(c); 只创建了一个实例s3,而许多线程将通过s3.putObject()上载图像。在转储信息中,我可以看到一个线程会在其他线程等待时锁定唯一的实例s3 因此,我认为如果我使用下面的代码,速度可能会更

我用过密码吗

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

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


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

对于我们中识字率较低的人。。。你是说Mark_H不应该创建S3客户端数组吗?您是否建议他使用一个S3客户端并将其传递给不同的线程?我想您是指这里的setMaxConnections方法?@mmcrae-这是正确的。跨线程重用客户端对象以更高效地使用资源(即,您共享一个连接池)@rogerdpack-yup,控制每个客户端的连接池大小。在hadoop世界中,有些不相关,如果您在hadoop 2.7+中使用s3a,那么可以使用fs.s3a.connection.max轻松调整到s3的连接数(可能还有2.6,尽管我不能确定)
private static AmazonS3 getS3(){
    int i = (int)(Math.random() * 10); 
    return amazonS3[i];
}