2013-05-03 13 views
13

は私が今までのスレッドの数十s3.putObjectで画像をアップロードする一方Amazon S3には接続プールがありますか?

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

1つのインスタンスのみS3が作成されたコードを使用します()。ダンプ情報では、他のスレッドが待機している間に、あるスレッドが唯一のインスタンス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が既に接続プールを使用していますか?私は混乱しています。

答えて

27

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

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

+0

urヘルプありがとうございます。あなたが正しいです。 –

+1

私たちの中には、あまり知られていない人がいます... Mark_H **はS3クライアントの配列を作るべきではないと言っていますか?あなたは彼が単一のS3クライアントを使用し、それを別のスレッドに渡すべきだと提案していますか? – mmcrae

+0

ここでsetMaxConnectionsメソッドを参照していますが、私は推測していますか? – rogerdpack

関連する問題