Question:
I ever used the code
1 2 3 4 5 |
public static AmazonS3Client s3 = null; ... BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa"); s3 = new AmazonS3Client(c); |
Only one instance s3 is created while dozens of threads will upload images by s3.putObject(). In the dump info, I could see that one thread would lock the only instance s3 while the others were waiting.
So I think maybe it will be faster if I use the code below:
1 2 3 4 |
BasicAWSCredentials c = new BasicAWSCredentials("absadgwslkjlsdjgflwa"); for(int i = 0; i < 10; i++) amazonS3[i] = new AmazonS3Client(c); |
Everytime the system will get a random s3 instance and then upload the image.
1 2 3 4 5 |
private static AmazonS3 getS3(){ int i = (int)(Math.random() * 10); return amazonS3[i]; } |
But it seems that the system slow down. Why that happened?
Maybe the only instance s3 has already used connection pool? I am confused.
Answer:
Each client in the AWS SDK for Java (including the Amazon S3 client) currently maintains it’s own HTTP connection pool. You can tune the maximum size of the HTTP connection pool through the ClientConfiguration class that can be passed into client object constructors.
We recommend sharing client objects, because of the expense and overhead of having too many HTTP connection pools that aren’t being utilized effectively. You should see better performance when you share client objects across threads like this.