22

コードを使ったことがある

public static AmazonS3Client s3 = null;
...
BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa");
s3 =  new AmazonS3Client(c);

数十のスレッドが s3.putObject() によって画像をアップロードする間、1 つのインスタンス s3 のみが作成されます。ダンプ情報を見ると、1 つのスレッドが唯一のインスタンス 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 がすでに接続プールを使用していますか? 私は混乱しています。

4

1 に答える 1

38

AWS SDK for Java (Amazon S3 クライアントを含む) の各クライアントは、現在、独自の HTTP 接続プールを維持しています。クライアント オブジェクト コンストラクターに渡すことができるClientConfiguration クラスを使用して、HTTP 接続プールの最大サイズを調整できます。

効果的に利用されていない HTTP 接続プールが多すぎると費用とオーバーヘッドが発生するため、クライアント オブジェクトを共有することをお勧めします。このようにスレッド間でクライアント オブジェクトを共有すると、パフォーマンスが向上するはずです。

于 2013-05-06T23:51:24.523 に答える