Conexión a Amazon DocumentDB con un controlador Java de MongoDB - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Conexión a Amazon DocumentDB con un controlador Java de MongoDB

En esta sección se proporciona una step-by-step guía para conectarse a Amazon DocumentDB mediante controladores Java. Esto le permitirá empezar a integrar DocumentDB en sus aplicaciones Java.

Paso 1: Configuración del proyecto

  1. Cree un proyecto java con Maven:

    mvn archetype:generate -DgroupId=com.docdb.guide -DartifactId=my-docdb-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  2. Añada el controlador Java de MongoDB como una dependencia para el proyecto en su archivo «pom.xml»:

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

Paso 2: crear una cadena de conexión

La cadena de conexión de Amazon DocumentDB es esencial para establecer una conexión entre la aplicación y el clúster de DocumentDB. Esta cadena encapsula información crucial, como el punto de conexión del clúster, el puerto, los detalles de autenticación y varias opciones de conexión. Para crear una cadena de conexión de DocumentDB, normalmente se empieza con el formato básico:

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

Deberá sustituir los términos «nombre de usuario» y «contraseña» por sus credenciales reales. Puede encontrar el punto final y el número de puerto de su clúster Consola de administración de AWS tanto en el AWS CLI. Consulte Búsqueda de puntos de conexión de un clúster para encontrar el punto de conexión del clúster. El puerto 27017 es el puerto predeterminado de DocumentDB.

Ejemplos de cadenas de conexión

  • Para establecer una conexión a DocumentDB mediante cifrado en tránsito y asegurarse de que las solicitudes de lectura vayan a las réplicas de lectura y escriban a la principal:

    "mongodb://username:password@cluster-endpoint:27017/?tls=true& tlsCAFile=global-bundle.pem& readPreference=secondaryPreferred& retryWrites=false"
  • Para establecer una conexión a DocumentDB mediante la autenticación de IAM:

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

Las diferentes opciones disponibles para la cadena de conexión son las siguientes:

Certificado TLS

tls=true|false: esta opción habilita o deshabilita la seguridad de la capa de transporte (TLS). De forma predeterminada, el cifrado en tránsito está habilitado en el clúster de Amazon DocumentDB y, por lo tanto, a menos que TLS esté deshabilitada en el nivel del clúster, el valor de esta opción debería ser true.

Cuando se utiliza TLS, el código debe proporcionar un certificado SSL cuando crea la conexión a un clúster de DocumentDB. Descargue el certificado necesario para realizar la conexión segura al clúster: global-bundle.pem. Hay dos formas de usar el archivo global-bundle.pem.

  • Opción 1: extraer todos los certificados del archivo global-bundle.pem y usar la herramienta clave de Java para almacenarlos en un archivo .jks que luego se pueda usar en el código. Consulte la pestaña Java en Conexión con TLS habilitado para ver el script que muestra cómo hacerlo.

  • Opción 2: añadir dinámicamente el archivo global-bundle.pem al código, crear un almacén de claves en memoria y usar SSLContext para proporcionar el certificado como parte de la conexión.

Lectura a partir de réplicas de lectura

replicaSet=rs0&readPreference=secondaryPreferred: si se especifican estas dos opciones, se redirigen todas las solicitudes de lectura a las réplicas de lectura y las solicitudes de escritura a la instancia principal. El uso de replicaSet=rs0 en la cadena de conexión permite que el controlador MongoDB mantenga una vista actualizada automáticamente de la topología del clúster, lo que permite que las aplicaciones mantengan la visibilidad de las configuraciones de nodos actuales a medida que se añaden o eliminan instancias. Si no se proporcionan estas opciones ni se especifica readPreference=primary, se envían todas las lecturas y escrituras a la instancia principal. Para obtener más opciones de readPreference, consulte Opciones de preferencia de lectura.

Write concern y registro en diario

La opción Write concern determina el nivel de reconocimiento solicitado a la base de datos para las operaciones de escritura. Los controladores MongoDB ofrecen una opción para ajustar los archivos de Write concern y de diario. Amazon DocumentDB no espera que establezca la opción de Write concern y diario, e ignora los valores enviados para w y j (writeConcern y journal). DocumentDB siempre escribe datos con writeConcern: majority yjournal: true de modo que las escrituras se registren de forma duradera en la gran mayoría de los nodos antes de enviar una confirmación al cliente.

RetryWrites

retryWrites=false: DocumentDB no admite reintentos de escritura y, por lo tanto, este atributo siempre debe estar establecido en false.

Autenticación de IAM

authSource=%24externaly authMechanism=MONGODB-AWS: estos dos parámetros se utilizan para autenticarse mediante AWS Identity and Access Management. En la actualidad, la autenticación de IAM está disponible solamente en la versión 5.0 del clúster basado en instancias. Para obtener más información, consulte Autenticación mediante la identidad de IAM.

Grupo de conexiones

Estas opciones están disponibles para la agrupación de conexiones:

  • maxPoolSize: establece el número máximo de conexiones que se pueden crear en el grupo. Cuando todas las conexiones están en uso y llega una nueva solicitud, espera a que haya una conexión disponible. El valor predeterminado para los controladores Java de MongoDB es 100.

  • minPoolSize: indica el número mínimo de conexiones que deben mantenerse en el grupo en todo momento. El valor predeterminado para los controladores Java de MongoDB es 0.

  • maxIdleTimeMS: determina cuánto tiempo puede permanecer inactiva una conexión en el grupo antes de cerrarla y eliminarla. El valor predeterminado para los controladores Java de MongoDB es 100 milisegundos.

  • waitQueueTimeoutMS: configura cuánto tiempo debe esperar un subproceso para que una conexión esté disponible cuando el grupo esté en su tamaño máximo. Si una conexión no está disponible en este tiempo, se produce una excepción. El valor predeterminado para los controladores Java de MongoDB es 120 000 milisegundos (2 minutos).

Parámetros de tiempo de espera de conexión

El tiempo de espera es un mecanismo para limitar el tiempo que puede tardar una operación o un intento de conexión antes de que se considere fallido. Los siguientes parámetros de tiempo de espera están disponibles para evitar esperas indefinidas y administrar la asignación de recursos:

  • connectTimeoutMS: configura cuánto tiempo esperará el controlador para establecer una conexión con el clúster. El valor predeterminado es de 10 000 milisegundos (10 segundos).

  • socketTimeoutMS: especifica cuánto tiempo esperará el controlador para recibir una respuesta del servidor para una operación que no sea de escritura. El valor predeterminado es 0 (sin tiempo de espera o es infinito).

  • serverSelectionTimeoutMS: especifica cuánto tiempo esperará el controlador para encontrar un servidor disponible en el clúster. El valor predeterminado de esta configuración es de 30 segundos y es suficiente para que se elija una nueva instancia principal durante la conmutación por error.

Paso 3: escribir el código de conexión

En el siguiente ejemplo de código se muestra cómo establecer una conexión de TLS a Amazon DocumentDB:

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); } }

Paso 4: gestionar excepciones de conexión

Cuando se trabaja con DocumentDB en aplicaciones Java, el manejo de las excepciones de conexión es crucial para mantener operaciones de base de datos sólidas y fiables. Si se gestionan adecuadamente, estas excepciones no solo ayudan a diagnosticar los problemas rápidamente, sino que también garantizan que la aplicación pueda gestionar sin problemas las interrupciones temporales de la red o la falta de disponibilidad del servidor, lo que mejora la estabilidad y la experiencia del usuario. Algunas de las excepciones más importantes relacionadas con el establecimiento de la conexión son las siguientes:

  • MongoException: es una excepción general y podría emitirse en varias situaciones no cubiertas por excepciones más específicas. Asegúrese de que esta excepción se gestione después de todas las demás excepciones específicas, ya que se trata de una excepción general de MongoDB.

  • MongoTimeoutException: se emite cuando se agota el tiempo de espera de una operación. Por ejemplo, cuando consulta un punto de conexión de un clúster que no existe.

  • MongoSocketException: se emite por problemas relacionados con la red. Por ejemplo, una desconexión repentina de la red durante una operación.

  • MongoSecurityException: se emite cuando se produce un error en la autenticación. Por ejemplo, cuando se intenta conectar con credenciales incorrectas.

  • MongoConfigurationException: se emite cuando hay un error en la configuración del cliente. Por ejemplo, si se utiliza una cadena de conexión no válida.

Paso 5: ejecutar el código

El siguiente ejemplo de código crea una conexión a Amazon DocumentDB e imprime todas las bases de datos:

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); } }

Prácticas recomendadas de conexión

Las siguientes son prácticas recomendadas que se deben tener en cuenta cuando se conecta a Amazon DocumentDB con un controlador Java de MongoDB:

  • Cierre siempre el MongoClient cuando ya no necesite que el cliente libere recursos.

  • Gestione las excepciones de forma adecuada e implemente un registro de errores adecuado.

  • Utilice variables de entorno o AWS Secrets Manager almacene información confidencial, como nombres de usuario y contraseñas.