Esta página ofrece soluciones potenciales a problemas que podrías encontrar al usar MongoDB Java Driver para conectarte a un despliegue de MongoDB.
Nota
Esta página aborda solo los problemas de conexión. Si encuentras otros problemas al utilizar MongoDB o el driver, visita los siguientes recursos:
El MongoDB Página de Stack Overflowo la comunidad MongoDB Reddit para encontrar ayuda para preguntas generales
Errores de conexión al servidor
Si se produce un problema cuando intentas conectar a un servidor, el driver de Java te devolverá un mensaje de error. Si este error se asemeja al siguiente mensaje, indica que el driver no puede conectarse a una implementación de MongoDB:
Error: couldn't connect to server 127.0.0.1:27017
Las siguientes secciones describen métodos que podrían ayudar a resolver el problema.
Comprueba la cadena de conexión
Verifica que el nombre del host y el número de puerto en la cadena de conexión sean correctos. En el mensaje de error de muestra, el nombre de host es 127.0.0.1 y el puerto es 27017. El valor de puerto por defecto para una instancia de MongoDB Server es 27017, pero puedes configurar MongoDB para escuchar en otro puerto.
Cuando te conectes a un set de réplicas, incluye todos los hosts del set de réplicas en tu cadena de conexión. Separar cada uno de los hosts en la cadena de conexión con una coma. Esto permite que el driver establezca una conexión si uno de los hosts es inaccesible.
Para aprender a especificar varios hosts de sets de réplicas, consulta la sección Conectar a un set de réplicas de la Guía de conexión.
Configura el Firewall
Si tu implementación de MongoDB está alojada detrás de un firewall, asegúrate de que el puerto en el que MongoDB escucha esté abierto en el firewall. Si tu implementación escucha en el puerto de red por defecto, asegúrate de que el puerto 27017 esté abierto en el firewall. Si su implementación escucha en un puerto diferente, asegúrese de que ese puerto esté abierto en el firewall.
Advertencia
No abras un puerto de firewall a menos que estés seguro de que es el que utiliza tu implementación de MongoDB.
Comprobar el número de conexiones
Cada instancia de MongoClient admite un número máximo de conexiones abiertas simultáneas en su pool de conexiones. El parámetro de configuración maxPoolSize define este valor y, por defecto, está establecido en 100. Si el número de conexiones abiertas es igual a maxPoolSize, el servidor espera hasta que una conexión se vuelva disponible. Si este tiempo de espera supera el valor maxIdleTimeMS, el driver responde con un error.
Para obtener más información sobre cómo funciona la agrupación de conexiones en el controlador, consulte la página Grupos de conexiones.
Errores de autenticación
El controlador de Java podría no poder conectarse a una implementación de MongoDB si la autorización no está configurada correctamente. En estos casos, el controlador muestra un mensaje de error similar al siguiente:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.
Las siguientes secciones describen métodos que pueden ayudar a resolver el problema.
Verifica el formato de las credenciales
Una de las causas más comunes de problemas de autenticación es el formato de credenciales no válido en la cadena de conexión de MongoDB.
Tip
Para obtener más información sobre el uso de cadenas de conexión, consulta URI de conexión en la Guía de conexión.
Si su cadena de conexión contiene un nombre de usuario y una contraseña, asegúrese de que tengan el formato correcto.
Nota
Si tu nombre de usuario o contraseña incluye alguno de los siguientes caracteres, debes codificar en porcentaje:
: / ? # [ ] @
Usa tu nombre de usuario y contraseña codificados en porcentaje en tu cadena de conexión.
Verifica el mecanismo de autenticación
Asegúrate de que tus credenciales y mecanismo de autenticación sean correctos. Se puede especificar tus credenciales de autenticación en las opciones de tu cadena de conexión.
Si construyes un cliente utilizando un MongoCredential, el método builder corresponde al mecanismo de autenticación. El siguiente código muestra el método builder para el SCRAM-SHA-256 mecanismo de autenticación:
MongoCredential credential = MongoCredential.createScramSha256Credential("<db_username>", "<authenticationDb>", "<dbpassword>");
Para obtener más información sobre cómo especificar los mecanismos de autenticación, consulta la sección Mecanismos de autenticación.
Verifica que el usuario esté en la base de datos de autenticación
Cuando se utiliza un método de autenticación basado en nombre de usuario y contraseña, el nombre de usuario debe estar definido en la base de datos de autenticación.
La base de datos de autenticación por defecto es la base de datos admin. Para usar una base de datos diferente para la autenticación, especifica la opción authSource en la cadena de conexión.
El siguiente ejemplo instruye a MongoDB para que use la base de datos users como la base de datos de autenticación:
MongoClient mongoClient = MongoClients.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users");
Errores de resolución de DNS
Es posible que el controlador de Java no pueda resolver su conexión DNS. En este caso, podría recibir un mensaje de error similar al siguiente:
com.mongodb.MongoSocketWriteException: Exception sending message
Si el controlador informa este error, pruebe los métodos de las siguientes secciones para resolver el problema.
Verifica la disponibilidad de la implementación de la base de datos
Si se está conectando a MongoDB Atlas y su controlador no puede encontrar el host DNS de la implementación de la base de datos Atlas, es posible que la implementación de la base de datos se pause o elimine.
Asegúrese de que la implementación de la base de datos exista en Atlas. Si el clúster está en pausa, puede reanudarlo en la interfaz de usuario de Atlas o en la interfaz de línea de comandos de Atlas.
Para saber cómo reanudar un clúster,consulte Reanudar un clúster en la documentación de Atlas.
Verifica las direcciones de la red
Verifica que las direcciones de red o nombres de host en tu cadena de conexión sean precisos.
Si la implementación está alojada en MongoDB Atlas, puedes seguir el tutorial Conectarse a su clúster para encontrar la cadena de conexión de Atlas.
Errores de certificado de seguridad
Si utilizas la versión de Java 8 o anterior, es posible que debas añadir un certificado a tu almacén de confianza. Puedes actualizar a una versión posterior del JDK o leer las instrucciones de Preguntas frecuentes sobre seguridad en la documentación de Atlas para obtener información sobre cómo añadir el certificado.
Errores de tiempo de espera
Cuando envías mensajes a través del controlador al servidor, a veces los mensajes tardan un poco en responder. Cuando esto ocurre, puede que recibas un mensaje de error similar a alguno de los siguientes:
Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description
Si recibes uno de estos errores, intenta los siguientes métodos para resolver el problema.
Configura maxConnectionTimeoutMS
La opción maxConnectionTimeoutMS indica el tiempo que el controlador de Java espera una conexión antes de agotar el tiempo de espera. El valor por defecto es 10000. Puedes aumentar este valor o establecerlo en 0 si quieres que el controlador nunca agote el tiempo de espera.
Establece maxConnectionLifeTime y maxConnectionIdleTime
Considere establecer maxConnectionLifeTime y maxConnectionIdleTime. Estos parámetros configuran cuánto tiempo el controlador mantiene una conexión con una instancia de MongoDB. Para obtener más información sobre estos parámetros, consulta Configuraciones del pool de conexiones.
Excepciones de tiempo de espera de selección de servidor
Tu aplicación podría no ser capaz de completar una solicitud aunque algunos servidores estén disponibles, lo que provoca que el controlador devuelva una excepción por tiempo de espera en la selección del servidor.
Esta excepción es de tipo MongoTimeoutException. Lo siguiente muestra una muestra de la excepción que ocurre si intentas enviar una solicitud a un set de réplicas en el que el primario no es accesible:
com.mongodb.MongoTimeoutException: Timed out while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=REPLICA_SET, servers=[ {address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}, {address=localhost:27018, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}}, {address=localhost:27019, type=REPLICA_SET_SECONDARY, roundTripTime=15.0 ms, state=CONNECTED} ] }
El error incluye una vista del estado del clúster que describe el estado de la conexión de cada nodo, lo que puede ayudarte a identificar la fuente de tu problema de conexión.
En el error anterior, el único servidor conectado, localhost:27019, es un nodo secundario. Por ello, la solicitud agota el tiempo de espera, ya que el controlador no puede seleccionar un servidor que cumpla con la preferencia de lectura primary. En esta situación, aún puede realizar operaciones de lectura en el nodo secundario conectado si establece la preferencia de lectura en secondary, secondaryPreferred o nearest.
También puedes especificar la opción de conexión serverSelectionTimeoutMS para ajustar el tiempo en el que el driver debe seleccionar un servidor. Para obtener más información, consulte la guía Configuración de clúster.
Errores varios
Esta sección muestra errores de conexión que no entran en una categoría más amplia.
Excepción del subproceso de monitorización
INFO: Exception in monitor thread while connecting to server ssc-cluster-01-shard-00-02.9cbnp.mongodb.net:27017
Esta línea de registro indica que el supervisar que verifica continuamente el estado de cada miembro de mongos set de réplicas o servidor no pudo contactar a uno de los nodos o servidores. Este es un mensaje esperado durante las operaciones de mantenimiento del servidor y puede ser ignorado de forma segura.
Excepción de solicitud de certificado
javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
Este es un problema conocido en ciertas versiones del JDK que puede ocurrir al intentar conectarse mediante el protocolo TLS 1.3.
Si encuentras este error al conectar a tu instancia o clúster de MongoDB, actualiza tu JDK a una de las siguientes versiones de parche o una más nueva:
JDK 11.0.7
JDK 13.0.3
JDK 14.0.2
Para obtener más información sobre este problema, consulte la descripción del problema en el rastreador de errores del sistema OpenJDK.
Consejos de depuración
Si bien no está relacionado con un mensaje de error específico, esta sección incluye información que puede ayudar en el proceso de solución de problemas de conexión.
Registro detallado para TLS/SSL
Puede usar la propiedad del sistema -Djavax.net.debug=all para habilitar el registro a nivel de depuración relacionado con todas las conexiones, incluyendo aquellas establecidas mediante TLS/SSL.
Activar el registro a nivel de depuración puede ayudarte a diagnosticar el problema raíz de los problemas de conexión. Para obtener más información sobre los mensajes de registro de TLS/SSL, consulta la documentación de Java Depuración de conexiones SSL/TLS.