Esta página ofrece posibles soluciones a los problemas que puede experimentar al conectarse a una instancia o un conjunto de réplicas de MongoDB mientras usa el controlador MongoDB Kotlin.
Nota
Esta página solo enumera problemas de conexión. Si tiene otros problemas con MongoDB, consulte los siguientes recursos:
La Tema Problemas y ayuda para obtener información sobre cómo informar errores, contribuir al driver y recursos adicionales
El MongoDB etiqueta de Stack Overflow o la Reddit Community de MongoDB para soporte general
Error de conexión
El siguiente mensaje de error es un mensaje general que indica que el controlador no puede conectarse a un servidor en el hostname o puerto especificado:
Error: couldn't connect to server 127.0.0.1:27017
Si recibes este error, prueba los siguientes métodos para resolver el problema.
Comprobar 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 es 27017, pero puede configurar MongoDB para que se comunique en otro puerto.
Configurar el firewall
Suponiendo que tu implementación de MongoDB utiliza el puerto por defecto, verifica que tu firewall tenga el puerto 27017 abierto. Si tu implementación está utilizando un puerto diferente, verifica que ese puerto esté abierto en tu firewall.
Importante
No abra puertos en el cortafuegos a menos que esté seguro de que ese es el puerto utilizado por su instancia de MongoDB.
Error de autenticación
El controlador de Kotlin puede fallar al conectar con una instancia de MongoDB si la autorización no está configurada correctamente. Esto a menudo da lugar a un mensaje de error similar al siguiente:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.
Si recibes este error, prueba los siguientes métodos para resolver el problema.
Comprobar cadena de conexión
Una cadena de conexión no válida es la causa más común de problemas de autenticación al intentar conectarse a MongoDB.
Nota
Para obtener más información sobre el uso de cadenas de conexión con el driver de Kotlin, consulta URI de conexión en la Guía de conexión.
Si su cadena de conexión contiene un nombre de usuario de base de datos y una contraseña para la base de datos, asegúrese de que estén en el formato correcto.
Nota
Si el nombre de usuario o la contraseña de la base de datos incluye alguno de los siguientes caracteres, deben estar codificados por porcentaje:
: / ? # [ ] @
Si tu implementación de MongoDB está en MongoDB Atlas, puedes verificar tu cadena de conexión utilizando el Ejemplo de conexión de Atlas. Asegúrate de reemplazar la cadena de conexión en el ejemplo con la tuya.
Al conectarse a un set de réplicas, es necesario incluir todos los hosts del set de réplicas en la 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.
Verifica que el usuario esté en la base de datos de autenticación
Para autenticar correctamente una conexión utilizando un nombre de usuario y una contraseña de base de datos, 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 authSource en la cadena de conexión. El siguiente ejemplo instruye al driver a utilizar users como la base de datos de autenticación:
val mongoClient = MongoClient.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users")
Error al enviar el mensaje
Cuando envía una solicitud a través del driver y no puede enviar el comando, a menudo muestra el siguiente mensaje de error general:
com.mongodb.MongoSocketWriteException: Exception sending message
Si recibes este error, prueba los siguientes métodos para resolver el problema.
Comprobar cadena de conexión
Verifica que la cadena de conexión en tu aplicación sea correcta. Esto se describe en Error de conexión y Error de autenticación.
Verifica que el usuario esté en la base de datos de autenticación
El usuario debe estar registrado en tu base de datos de autenticación. Esto se describe en Error de autenticación..
Configurar el firewall
El firewall necesita tener un puerto abierto para comunicarse con la instancia de MongoDB. Isto está descrito em Erro de Conexão.
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 ya hay un número de conexiones abiertas igual a maxPoolSize, el servidor espera hasta que una conexión esté disponible. Si este tiempo de espera supera el valor maxIdleTimeMS, el driver responde con un error.
Error de tiempo de espera
A veces, al enviar mensajes al servidor a través del controlador, estos tardan en responder. En este caso, podría recibir un mensaje de error similar a uno 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 la cantidad de tiempo que el controlador de Kotlin espera por 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 se puede mantener una conexión con una instancia de MongoDB. Para obtener más información sobre estos parámetros, consulta Configuraciones del pool de conexiones.
Comprobar el número de conexiones
Es posible que tengas demasiadas conexiones abiertas. La solución a esto se describe en Error al enviar el mensaje.
Consejos adicionales
Aunque no está relacionado con un mensaje de error específico, esta sección incluye información adicional que puede resultar útil al intentar solucionar problemas de conexión.
Obtener información del registro de TLS/SSL
Al usar TLS/SSL, puede usar la -Djavax.net.debug=all propiedad del sistema para ver declaraciones de registro adicionales. Esto puede ser útil al intentar depurar cualquier problema de conexión. Consulte la guía de Oracle para depurar conexiones TLS/SSL para obtener más información.