将 AWS Java SDK 客户端对象声明为静态以供并发使用是否安全?

问题描述 投票:0回答:2

使用 AWS Java SDK 同时处理多个请求是否安全?例如,如果我有一台 Web 服务器同时处理多个请求,并且一个或多个请求需要访问 DynamoDB,那么使用静态访问器方法进行读取和写入的静态客户端对象是否安全,例如

public class DynamoDBManager {

    private static AmazonDynamoDBClient client = new AmazonDynamoDBClient(CREDENTIALS);

    public static void doRead(String hashKey) {
        // use the client to read
    }

    public static void doWrite(MyData data) {
        // use the client to write
    }
}

...或者我应该在方法和客户端对象上删除静态修饰符,以便每次 Web 服务器请求需要访问数据库时,它都必须实例化管理器类以获取它自己的客户端版本。

如果客户端对象是静态的,会出现并发问题或冲突吗?我在这里使用 DynamoDB 作为示例,但我对 S3 客户端的相同场景同样感兴趣。

java amazon-web-services
2个回答
14
投票

适用于 Java 的 AWS 开发工具包中的所有客户端都是线程安全的,您应该重用客户端对象。


0
投票

为了证实Julio的回答,它们是线程安全的,建议重用客户端。以下是一些链接:

Java SDK v1

客户端生命周期

SDK 中的服务客户端是线程安全的,为了获得最佳性能,您应该将它们视为长期对象。每个客户端都有自己的连接池资源。当不再需要客户端时显式关闭客户端以避免资源泄漏。

https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/creating-clients.html#client-lifecycle

Java SDK v2

如果可能,重用 SDK 客户端

每个SDK客户端维护自己的HTTP连接池。池中已存在的连接可以被新请求重用,以减少建立新连接的时间。我们建议共享客户端的单个实例,以避免因拥有太多未有效使用的连接池而产生的开销。所有 SDK 客户端都是线程安全的。

如果您不想共享客户端实例,请在不需要客户端时调用实例的 close() 来释放资源。

https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/best-practices.html#bestpractice1

此外,如果您查看客户端的 Java SDK 文档,您会发现它们现在带有

@ThreadSafe
注释。

© www.soinside.com 2019 - 2024. All rights reserved.