在使用AWS时,是否有推荐的方法来管理与AmazonS3的连接?
典型的Amazon S3代码(取自亚马逊官方样本)通常看起来像这样?
AmazonS3 s3 = new AmazonS3Client(...);
...
s3.putObject(new PutObjectRequest(bucketName, project.getName() + "/" + imageFile.getName(), imageFile));
以下是问题:
维护代码中每个人使用的单个AmazonS3Client是一个好主意,还是最好每次调用都创建一个?
是否存在连接池的概念,例如在使用MySQL时?
断开连接(MySQL类比:MySQL重启)之类的问题是否相关,以致AmazonS3Client变得无效并需要重新创建?如果是这样,处理断开连接的正确方法是什么?
有谁知道spring与spring集成提供的功能:https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-aws
THX。
答案 0 :(得分:21)
我会重复这些问题:
维护单个AmazonS3Client是一个好主意 代码中的每个人还是最好在每次通话时创建一个?
Java SDK中的所有客户端类都是线程安全的,因此通常重新使用单个客户端比实例化新客户端更好。或者,如果您在多个地区或凭证上同时运营,那么也是如此。
是否存在连接池的概念,例如在使用MySQL时?
是的,客户端中存在连接管理,特别是如果您直接使用TransferManager
类而不是AmazonS3Client
。
像断开连接这样的问题(MySQL类比:重启了MySQL) 相关的,以使AmazonS3Client变得无效并且需要 娱乐?如果是,处理断开连接的正确方法是什么 所以?
默认情况下,客户端会使用指数退避重试可恢复的错误。 如果确实失败/断开连接,则需要根据您的应用处理异常。 见:http://docs.aws.amazon.com/general/latest/gr/api-retries.html
有没有人知道弹簧整合提供了什么样的恐惧? 与aws在: https://github.com/spring-projects/spring-integration-extensions/tree/master/spring-integration-aws
它提供了声明式实例化,注入和实用程序类,以便更容易地集成到Spring项目中,类似于JDBC,JMS等帮助程序......
有关更多AWS SDK提示和技巧,请参阅:http://aws.amazon.com/articles/3604?_encoding=UTF8&jiveRedirect=1
答案 1 :(得分:9)
以下两个问题需要注意一些重要事项:
维护代码中每个人使用的单个AmazonS3Client是一个好主意,还是最好在每次调用时创建一个?
只创建一个。 AmazonS3Client有一个错误,即当收集垃圾时,它会清理其他AmazonS3Client实例共享的资源,导致这些实例无效,即使这些其他实例正在处理上载或下载。当我们为每个请求创建AmazonS3Client时,我们遇到了这个问题。亚马逊显然不认为这是一个错误。只需创建一个AmazonS3Client,在应用程序的生命周期内保留它,并在代码中的所有线程中使用它,就可以避免这种错误。
断开连接(MySQL类比:MySQL重启)之类的问题是否相关,以致AmazonS3Client变得无效并需要重新创建?如果是这样,处理断开连接的正确方法是什么?
上传和下载可能会失败,但它们不会使仍然可以使用的AmazonS3Client无效。处理AmazonS3Client未成功重试的断开连接的正确方法是根据您的应用程序重试自己或报告失败,并继续使用AmazonS3Client进行您需要执行的任何其他S3交互。