Red de conocimiento informático - Aprendizaje de programación - Problema de conexión de Java Mongo, siempre se agota el tiempo de espera, se desconoce el motivo

Problema de conexión de Java Mongo, siempre se agota el tiempo de espera, se desconoce el motivo

Operaciones de agregación sobre colecciones de más de un millón de registros.

DBObject match=(DBObject)JSON.parse("{$match:{logType:{'$in':}}}"); DBObject group=(DBObject)JSON.parse("{$ grupo: {'_id': '$domainUrl', 'count': {'$sum': 1}}}"); AggregationOutput salida = logCollection.aggregate(match, group);

Ocasionalmente A Se produjo una excepción de tiempo de espera de lectura.

com.mongodb.MongoException$Network: Error en la operación de lectura en la base de datos adLogTable en com.mongodb.DBTCPConnector.inner para el servidor /192.168.10.202:27017. DBTCPConnector.innerCall(DBTCPConnector.java:253) en com.mongodb.DB.command(DB.java:261) en com.mongodb.DB.command(DB.java:243) ...Causa: java.net.SocketTimeoutException : Tiempo de espera de lectura en java.net.SocketInputStream.socketRead0 (método nativo). SocketInputStream.read(SocketInputStream.java: 152)

A través de muchas pruebas, descubrimos que el tiempo promedio para realizar la agregación es de 5 segundos. Cuando excede los 5 segundos, se informará un error.

Luego verifique la información de configuración de MongoDB:

socket-timeout="5000" //5s

La configuración predeterminada de socket-timeout es 0, es decir Es decir, no hay límite.

Si no hay un límite de tiempo de espera, no será fácil saber si hay un problema con el sistema, por lo que se debe dar un tiempo de espera razonable según la situación real.

A través de muchas pruebas, descubrimos que el tiempo de ejecución más largo fue de 6 segundos, por lo que configuramos el tiempo de espera en 10000.

socket-timeout="10000" //10s

Nota: Cuando MongoDB se integra con Spring, si desea configurar varias fuentes de MongDB, solo se habilitará el último lt; mongo: opcionesgt; configuración.

La información de configuración de los parámetros debe almacenarse en archivos de propiedades.

lt; mongo: mongo host="${mongodb.ip}" id="mongo202" port="${mongodb.port}"gt; opciones conexiones-por-host= "200" subprocesos permitidos para bloquear para conexión-multiplicador="100" connect-timeout="1000" max-wait-time="1000" auto-connect-retry="true" socket-keep-alive ="true" socket-timeout="10000" esclavo-ok="true" write-number="1" write-timeout="0" write-fsync="true" /gt /mongo: mongogt; /p>

Obtener parámetros de configuración a través de la API de Java

DBCollection logCollection = mongoTemplate. getCollection(collName); MongoOptions mongoOptions = logCollection.getDB().getMongo().getMongoOptions(); System.out.println(mongoOptions.getSocketTimeout());

El último punto: entre ConnectionTimeOut y SocketTimeOut La diferencia:

Una solicitud completa incluye tres etapas:

Establecer conexión

Transmisión de datos

Desconectar

Si el tiempo requerido para establecer una conexión con el servidor que solicita la conexión (en este caso, la base de datos) excede ConnectionTimeOut, se generará una excepción ConnectionTimeOutException, es decir, la conexión del servidor se agota y la conexión no se establece dentro del tiempo especificado. .

Si la conexión con el servidor es exitosa, comienza la transferencia de datos.

Si el servidor tarda demasiado en procesar datos y excede SocketTimeOut, se generará un SocketTimeOutExceptin, lo que significa que la respuesta del servidor expiró y el servidor no devolvió los datos al cliente dentro del tiempo especificado.