使用 MongoDB Java 驱动程序连接到亚马逊 DocumentDB - Amazon DocumentDB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 MongoDB Java 驱动程序连接到亚马逊 DocumentDB

本节提供使用 Java 驱动程序连接亚马逊文档数据库的 step-by-step指南。这将使你开始将文档数据库集成到你的 Java 应用程序中。

第 1 步:设置您的 项目

  1. 使用 Maven 创建 Java 项目:

    mvn archetype:generate -DgroupId=com.docdb.guide -DartifactId=my-docdb-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  2. 将 MongoDB Java 驱动程序作为项目的依赖项添加到你的 “pom.xml” 文件中:

    <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>5.3.0</version> </dependency>

步骤 2:创建连接字符串

Amazon DocumentDB 连接字符串对于在您的应用程序和 DocumentDB 集群之间建立连接至关重要。此字符串封装了关键信息,例如集群终端节点、端口、身份验证详细信息和各种连接选项。要构建 DocumentDB 连接字符串,通常从基本格式开始:

"mongodb://username:password@cluster-endpoint:port/?[connection options]"

您需要将 “用户名” 和 “密码” 替换为实际凭证。你可以在中找到集群的终端节点和端口号 AWS Management Console ,也可以通过 AWS CLI。查找集群的端点要查找您的集群的集群终端节点,请参阅。DocumentDB 的默认端口是 27017。

连接字符串示例

  • 使用传输中的加密与 DocumentDB 建立连接,并确保读取请求发送到只读副本并写入主副本:

    "mongodb://username:password@cluster-endpoint:27017/?tls=true& tlsCAFile=global-bundle.pem& readPreference=secondaryPreferred& retryWrites=false"
  • 使用 IAM 身份验证与 DocumentDB 建立连接:

    "mongodb://cluster-endpoint:27017/?tls=true& tlsCAFile=global-bundle.pem& readPreference=secondaryPreferred& retryWrites=false& authSource=%24external& authMechanism=MONGODB-AWS"

连接字符串可用的不同选项如下所示:

TLS 证书

tls=true|false— 此选项启用或禁用传输层安全 (TLS)。默认情况下,Amazon DocumentDB 集群启用传输中加密,因此,除非在集群级别禁用 TLS,否则此选项的值应为。true

使用 TLS 时,在创建与 DocumentDB 集群的连接时,代码需要提供 SSL 证书。下载与集群建立安全连接所需的证书:global-bundle.pem。有两种使用该global-bundle.pem文件的方法。

  • 选项 1 — 从global-bundle.pem文件中提取所有证书,然后使用 Java 的 keytool 将它们存储在.jks文件中,以便以后在代码中使用。有关如何执行此操作启用了 TLS 的情况下的连接的脚本,请参阅中的 Java 选项卡。

  • 选项 2-在代码中动态添加global-bundle.pem文件,构建内存密钥库,并在建立连接时使用SSLContext提供证书。

从只读副本读取

replicaSet=rs0&readPreference=secondaryPreferred— 指定这两个选项会将所有读取请求路由到只读副本,将写入请求路由到主实例。replicaSet=rs0在连接字符串中使用可让 MongoDB 驱动程序维护自动更新的集群拓扑视图,从而允许应用程序在添加或删除实例时保持对当前节点配置的可见性。不提供这些选项或指定readPreference=primary会将所有读取和写入操作发送到主实例。有关更多选项readPreference,请参阅读取首选项选项

写关注和日记

写入问题决定了数据库为写入操作请求的确认级别。MongoDB 驱动程序提供了调整写入问题和日志文件的选项。Amazon DocumentDB 不希望您设置写入关注点和日志,并且会忽略为和jw和)writeConcern发送的值。journalDocumentDB 总是使用writeConcern:majorityjournal:写入数据,true因此在向客户端发送确认之前,写入操作会持久地记录在大多数节点上。

RetryWrites

retryWrites=false— DocumentDB 不支持可重试写入,因此应始终将此属性设置为。false

IAM 身份验证

authSource=%24externalauthMechanism=MONGODB-AWS — 这两个参数用于使用进行身份验证 AWS Identity and Access Management。IAM 身份验证目前仅在基于实例的集群版本 5.0 中可用。有关更多信息,请参阅 使用 IAM 身份进行身份验证

连接池

以下选项可用于连接池:

  • maxPoolSize— 设置可在池中创建的最大连接数。当所有连接都在使用中并且有新的请求进来时,它会等待连接变为可用。MongoDB Java 驱动程序的默认值为 100。

  • minPoolSize— 表示应始终在池中维护的最小连接数。MongoDB Java 驱动程序的默认值为 0。

  • maxIdleTimeMS— 确定连接在关闭和移除之前可以在池中保持空闲状态多长时间。MongoDB Java 驱动程序的默认值为 100 毫秒。

  • waitQueueTimeoutMS— 配置当池达到最大大小时,线程应等待连接变为可用多长时间。如果连接在这段时间内不可用,则会引发异常。MongoDB Java 驱动程序的默认值为 120,000 毫秒(2 分钟)。

连接超时参数

超时是一种机制,用于限制操作或连接尝试在被视为失败之前可能花费的时间。以下超时参数可用于防止无限期等待和管理资源分配:

  • connectTimeoutMS— 配置驱动程序将等待多长时间才能建立与集群的连接。默认值为 10,000 毫秒(10 秒)。

  • socketTimeoutMS— 指定驱动程序将等待服务器对非写入操作的响应多长时间。默认值为 0,(无超时或无限期)。

  • serverSelectionTimeoutMS— 确定驱动程序要等待多长时间才能在集群中找到可用的服务器。此设置的默认值为 30 秒,足以在故障转移期间选择新的主实例。

步骤 3:编写连接代码

以下代码示例显示了如何与 Amazon DocumentDB 建立 TLS 连接:

public static MongoClient makeDbConnection(String dbName, String DbUserName, String DbPassword, String DbClusterEndPoint, String keyStorePass) throws Exception { MongoClient connectedClient; String connectionOptions = "?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false"; String connectionUrl = "mongodb://" + DbUserName + ":" + DbPassword + "@" + DbClusterEndPoint + ":27017/" + dbName + connectionOptions; try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); try (FileInputStream fis = new FileInputStream("src/main/resources/certs/truststore.jks")) { trustStore.load(fis, keyStorePass.toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); ConnectionString connectionString = new ConnectionString(connectionUrl); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connectionString) .applyToSslSettings(builder - > { builder.enabled(true); builder.context(sslContext); }) .build(); connectedClient = MongoClients.create(settings); } return connectedClient; } catch (MongoException e5) { throw new RuntimeException(e5); } catch (Exception e) { throw new RuntimeException(e); } }

步骤 4:处理连接异常

在 Java 应用程序中使用 DocumentDB 时,处理连接异常对于保持稳健可靠的数据库操作至关重要。如果管理得当,这些异常不仅有助于快速诊断问题,还可以确保您的应用程序能够优雅地处理临时网络中断或服务器不可用,从而改善稳定性和用户体验。与建立连接有关的一些关键例外情况包括:

  • MongoException— 一般例外情况,可以在更具体的例外情况未涵盖的各种情况下发布。请确保在所有其他特定异常之后处理此异常,因为这是通用的 catch all MongoDB 异常。

  • MongoTimeoutException— 在操作超时时发出。例如,查询不存在的集群终端节点。

  • MongoSocketException— 针对网络相关问题发行。例如,操作期间网络突然断开连接。

  • MongoSecurityException— 在身份验证失败时发出。例如,使用不正确的凭据进行连接。

  • MongoConfigurationException— 当客户端配置出现错误时发出。例如,使用无效的连接字符串。

第 5 步:运行代码

以下代码示例创建 Amazon DocumentDB 连接并打印所有数据库:

public static void TestConnection() { try (MongoClient mongoClient = makeDbConnection(DATABASE_NAME, DB_USER_NAME, DB_PASSWORD, DB_CLUSTER_ENDPOINT, KEYSTORE_PASSWORD)) { List < String > databases = mongoClient.listDatabaseNames().into(new ArrayList < > ()); System.out.println("Databases: " + databases); } catch (MongoException e) { System.err.println("MongoDB error: " + e.getMessage()); throw new RuntimeException(e); } }

连接最佳实践

以下是使用 MongoDB Java 驱动程序连接到亚马逊 DocumentDB 时需要考虑的最佳实践:

  • 当您不再需要客户端释放资源MongoClient时,请务必关闭您的。

  • 适当地处理异常并实现正确的错误记录。

  • 使用环境变量或 AWS Secrets Manager 存储敏感信息,例如用户名和密码。