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:
El MongoDB Etiqueta Stack Overflow o la comunidad MongoDB Reddit 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 nombre de host o puerto especificado:
Error: couldn't connect to server 127.0.0.1:27017
Si recibe este error, pruebe los siguientes métodos para resolver el problema.
Comprobar cadena de conexión
Verifique que el nombre de host y el número de puerto en la cadena de conexión sean correctos. En el mensaje de error de ejemplo, el nombre de host es 127.0.0.1 El puerto es 27017. El valor de puerto predeterminado para una instancia de MongoDB es 27017, pero puede configurar MongoDB para que se comunique en otro puerto.
Configurar el firewall
Suponiendo que su implementación de MongoDB usa el puerto predeterminado, verifique que su firewall tenga abierto el puerto 27017. Si su implementación usa un puerto diferente, verifique que esté abierto en su firewall.
Importante
No abra puertos en su firewall a menos que esté seguro de que es el puerto utilizado por su instancia de MongoDB.
Error de autenticación
El controlador de Kotlin puede fallar al conectarse a una instancia de MongoDB si la autorización no está configurada correctamente. Esto suele generar un mensaje de error similar al siguiente:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.
Si recibe este error, pruebe 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 controlador Kotlin, consulte 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 de base de datos, asegúrese de que tengan 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 su implementación de MongoDB está en MongoDB Atlas, puede comprobar su cadena de conexión con el ejemplo de conexión de Atlas. Asegúrese de reemplazar la cadena de conexión del ejemplo con la suya.
Al conectarse a un conjunto de réplicas, debe incluir todos los hosts en la cadena de conexión. Separe cada host con una coma. Esto permite que el controlador establezca una conexión si uno de los hosts no es accesible.
Verificar que el usuario esté en la base de datos de autenticación
Para autenticar correctamente una conexión mediante 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 predeterminada es admin. Para usar una base de datos diferente para la autenticación, especifique authSource en la cadena de conexión. El siguiente ejemplo indica al controlador que use users como 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 controlador y este no puede enviar el comando, a menudo muestra el siguiente mensaje de error general:
com.mongodb.MongoSocketWriteException: Exception sending message
Si recibe este error, pruebe 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.
Verificar que el usuario esté en la base de datos de autenticación
El usuario debe estar reconocido en la 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 MongoClient admite un número máximo de conexiones abiertas simultáneas en su grupo de conexiones. El parámetro de configuración maxPoolSize define este valor y está establecido en 100 de forma predeterminada. Si ya hay maxPoolSize conexiones abiertas, el servidor espera hasta que haya una disponible. Si este tiempo de espera supera el valor maxIdleTimeMS, el controlador 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 el tiempo que el controlador Kotlin espera una conexión antes de agotar el tiempo de espera. El valor predeterminado es 10000. Puede aumentar este valor o establecerlo en 0 si desea que el controlador nunca agote el tiempo de espera.
Establezca maxConnectionLifeTime y maxConnectionIdleTime
Considere configurar maxConnectionLifeTime maxConnectionIdleTimey. Estos parámetros configuran la duración de la conexión con una instancia de MongoDB. Para obtener más información sobre estos parámetros, consulte Configuración del grupo de conexiones.
Comprobar el número de conexiones
Es posible que tenga demasiadas conexiones abiertas. La solución se describe en "Error al enviar mensaje".
Consejos adicionales
Si bien no está relacionado con un mensaje de error específico, esta sección incluye información adicional que puede ser útil al intentar solucionar problemas de conexión.
Obtener información de registro para 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.