Solução de problemas de conexão
Nesta página
- Erros de conexão do servidor
- Verifique a string de conexão
- Configurar firewall
- Verifique o número de conexões
- Erros de autenticação
- Verifique a formatação das credenciais
- Verificar o mecanismo de autenticação
- Verificar se o usuário está no banco de dados de autenticação
- Erros de resolução de DNS
- Verifique a disponibilidade de implantação de banco de dados
- Verifique os endereços de rede
- Erros de certificado de segurança
- Erros de tempo limite
- definir
maxConnectionTimeoutMS
- Defina
maxConnectionLifeTime
emaxConnectionIdleTime
- Exceções de tempo limite de seleção do servidor MongoDB
- Erros diversos
- Exceção para monitorar thread
- Exceção de solicitação de certificado
- Dicas de depuração
- Registro de verbosidade para TLS/SSL
Esta página oferece possíveis soluções para problemas que você pode encontrar ao usar o driver Java do MongoDB para se conectar a uma implantação do MongoDB.
Observação
Esta página aborda apenas problemas de conexão. Se você encontrar outros problemas ao usar o MongoDB ou o driver, acesse os seguintes recursos:
A páginaProblemas e ajuda do para obter informações sobre como reportar bugs, contribuir para o driver e encontrar mais recursos
Os Fóruns da MongoDB Community para perguntas, discussões ou suporte técnico geral
A página de Perguntas frequentes (FAQ) para obter respostas a perguntas frequentes sobre o driver Java
Erros de conexão do servidor
Quando ocorre um problema ao tentar se conectar a um servidor, o driver Java retorna uma mensagem de erro. Se esse erro for semelhante à seguinte mensagem, isso indica que o driver não pode se conectar a um sistema do MongoDB:
Error: couldn't connect to server 127.0.0.1:27017
As seções a seguir descrevem métodos que podem ajudar a resolver o problema.
Verifique a string de conexão
Verifique se o nome do host e o número da porta na string de conexão estão corretos. Na mensagem de erro da amostra, o nome do host é 127.0.0.1
e a porta é 27017
. O valor de porta padrão para uma instância do MongoDB Server é 27017
, mas você pode configurar o MongoDB para escutar em outra porta.
Ao conectar a um conjunto de réplicas, inclua todos os hosts do conjunto de réplicas em sua connection string. Separe cada um dos hosts na connection string com uma vírgula. Isto permite ao condutor estabelecer uma conexão se um dos hosts não estiver acessível.
Para saber como especificar vários hosts de conjuntos de réplicas, consulte a seção Conectar-se a um conjunto de réplicas do Guia de conexão.
Configurar firewall
Se sua implantação do MongoDB estiver hospedada atrás de um firewall, certifique-se de que a porta na qual o MongoDB escuta esteja aberta no firewall. Se sua implantação escutar na porta de rede padrão, verifique se a porta 27017
está aberta no firewall. Se sua implantação escutar em uma porta diferente, certifique-se de que a porta esteja aberta no firewall.
Aviso
Não abra uma porta de firewall, a menos que tenha certeza de que é aquela que sua implantação do MongoDB escuta.
Verifique o número de conexões
Cada instância do MongoClient
aceita um número máximo de conexões abertas simultâneas em seu pool de conexões. O parâmetro de configuração maxPoolSize
define este valor e é configurado para 100
por padrão. Se o número de conexões abertas for igual a maxPoolSize
, o servidor aguardará até que uma conexão fique disponível. Se esse tempo de espera exceder o valor de maxIdleTimeMS
, o driver responderá com um erro.
Para saber mais sobre como o pool de conexões funciona no driver, consulte Como funciona o pool de conexões no driver Java? nas perguntas frequentes.
Erros de autenticação
O Java Driver pode não conseguir se conectar a uma implementação do MongoDB se a autorização não estiver configurada corretamente. Nesses casos, o driver levanta uma mensagem de erro semelhante à seguinte mensagem:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.
As seções a seguir descrevem métodos que podem ajudar a resolver o problema.
Verifique a formatação das credenciais
Uma das causas mais comuns de problemas de autenticação é a formatação de credenciais inválidas na string de conexão do MongoDB.
Dica
Para obter mais informações sobre o uso de strings de conexão, consulte a página URI de conexão no Guia de conexão.
Se sua string de conexão contiver um nome de usuário e senha, certifique-se de que eles estejam no formato correto.
Observação
Se seu nome de usuário ou senha incluir qualquer um dos seguintes caracteres, você deverá codificar por porcentagem:
: / ? # [ ] @
Use seu nome de usuário e senha codificados em porcentagem na sua string de conexão.
Verificar o mecanismo de autenticação
Verifique se as credenciais e o mecanismo de autenticação estão corretos. Você pode especificar suas credenciais de autenticação nas opções da sua string de conexão.
Se você construir um cliente usando um MongoCredential
, o método construtor corresponde ao mecanismo de autenticação. O código a seguir mostra o método construtor para o mecanismo de autenticação SCRAM-SHA-256
:
MongoCredential credential = MongoCredential.createScramSha256Credential("<db_username>", "<authenticationDb>", "<dbpassword>");
Para saber mais sobre como especificar mecanismos de autenticação, consulte os guias Mecanismos de autenticação e Mecanismos de autenticação empresarial.
Verificar se o usuário está no banco de dados de autenticação
Se utilizar um método de autenticação baseado em nome de usuário e senha, o nome de usuário deve ser definido no banco de dados de autenticação.
O banco de dados de autenticação padrão é o banco de dados admin
. Para usar outro banco de dados de autenticação, especifique a opção authSource
na string de conexão.
O exemplo a seguir instrui o MongoDB a usar o banco de dados users
como o banco de dados de autenticação:
MongoClient mongoClient = MongoClients.create("mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users");
Erros de resolução de DNS
O Java Driver pode não conseguir resolver sua conexão DNS. Quando isso acontece, você pode receber uma mensagem de erro semelhante à seguinte:
com.mongodb.MongoSocketWriteException: Exception sending message
Se o driver relatar esse erro, tente os métodos nas seções a seguir para resolver o problema.
Verifique a disponibilidade de implantação de banco de dados
Se você estiver se conectando ao MongoDB Atlas e seu driver não conseguir encontrar o host DNS da implantação de banco de dados Atlas, a implantação de banco de dados poderá ser pausada ou excluída.
Certifique-se de que o sistema de banco de dados exista no Atlas. Se o cluster estiver pausado, você poderá retomar o cluster na UI do Atlas ou na interface da linha de comando do Atlas.
Para saber como retomar um cluster, consulte Retomar um cluster na documentação do Atlas.
Verifique os endereços de rede
Verifique se os endereços de rede ou nomes de host em sua string de conexão estão corretos.
Se a sua implantação estiver hospedada no MongoDB Atlas, você poderá seguir o tutorial Conectar ao Seu Cluster para localizar sua connection string do Atlas.
Erros de certificado de segurança
Se você utilizar o Java versão 8 ou anterior, você poderá precisar adicionar um certificado ao seu armazenamento de confiança. Você pode atualizar para uma versão posterior do JDK ou ler as instruções de Perguntas frequentes de segurança na documentação do Atlas para obter informações sobre como adicionar o certificado.
Erros de tempo limite
Ao enviar mensagens para o servidor através do driver, as mensagens ocasionalmente demoram um pouco para responder. Se isso acontecer, você poderá receber uma mensagem de erro semelhante a uma das mensagens a seguir:
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
Se você receber um desses erros, tente os seguintes métodos para resolver o problema.
definir maxConnectionTimeoutMS
A opção maxConnectionTimeoutMS
indica o tempo que o driver Java aguarda uma conexão antes de atingir o tempo limite. O valor padrão é 10000
. Você pode aumentar esse valor ou defini-lo como 0
se quiser que o driver nunca atinja o tempo limite.
Definir maxConnectionLifeTime
e maxConnectionIdleTime
Considere configurar maxConnectionLifeTime
e maxConnectionIdleTime
. Esses parâmetros configuram a duração da conexão do driver com uma instância do MongoDB. Para obter mais informações sobre esses parâmetros, consulte a página Configurações do pool de conexões.
Exceções de tempo limite de seleção do servidor MongoDB
Talvez seu aplicativo não consiga concluir uma solicitação mesmo quando alguns servidores estão disponíveis, fazendo com que o driver retorne uma exceção de tempo limite de seleção de servidor.
Esta exceção é do tipo MongoTimeoutException
. Veja a seguir uma amostra da exceção que ocorre se você tentar enviar uma solicitação para um conjunto de réplicas no qual o primary não está acessível:
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} ] }
O erro inclui uma exibição do estado do cluster que descreve o estado da conexão de cada nó, o que pode ajudá-lo a identificar a origem do problema de conexão.
No erro anterior, o único servidor conectado, localhost:27019
, é um nó secundário. Por esse motivo, a solicitação expira, pois o driver não consegue selecionar um servidor que satisfaça a preferência de leitura de primary
. Nessa situação, você ainda pode executar operações de leitura no nó secundário conectado se definir a read preference para secondary
, secondaryPreferred
ou nearest
.
Você também pode especificar a opção de conexão serverSelectionTimeoutMS
para ajustar a quantidade de tempo em que o driver deve selecionar um servidor. Para saber mais, consulte o guia Opções de conexão .
Erros diversos
Esta seção mostra os erros de conexão que não se enquadram em uma categoria mais ampla.
Exceção para monitorar thread
INFO: Exception in monitor thread while connecting to server ssc-cluster-01-shard-00-02.9cbnp.mongodb.net:27017
Esta linha de registro indica que o monitor que verifica continuamente o status de cada membro do conjunto de réplicas ou servidor mongos
falhou ao entrar em contato com um dos nós ou servidores. Esta é uma mensagem esperada durante operações de manutenção do servidor e pode ser ignorada com segurança.
Exceção de solicitação de certificado
javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request
Esse é um problema conhecido em determinadas versões do JDK que pode ocorrer ao tentar se conectar usando o TLS 1.3 protocolo.
Se você encontrar esse erro ao se conectar à sua instância ou cluster do MongoDB, atualize seu JDK para uma das seguintes versões de patch ou mais recentes:
JDK 11.0.7
JDK 13.0.3
JDK 14.0.2
Para saber mais sobre esse problema, consulte a descrição do problema na questão do rastreador do sistema OpenJDK Bug.
Dicas de depuração
Embora não esteja relacionada a uma mensagem de erro específica, esta seção inclui informações que podem ajudar no processo de solução de problemas de conexão.
Registro de verbosidade para TLS/SSL
É possível usar a propriedade de sistema -Djavax.net.debug=all
para habilitar o log em nível de depuração relacionado a todas as conexões, incluindo as conexões estabelecidas usando TLS/SSL.
Habilitar o registro em nível de depuração pode ajudá-lo a diagnosticar o problema raiz dos problemas de conexão. Para saber mais sobre as mensagens de registro TLS/SSL, consulte a seção Depuração de conexões SSL/TLS Documentação Java.