Estoy escribiendo una aplicación Go usando mongo-driver para conectarme al conjunto de réplicas de mongo.
Me di cuenta de que mongo.Connect
no se conecta realmente a la base de datos.
Incluso si he cerrado la instancia de mongod
, mongo.Connect
puede pasar.
Sin embargo, cuando haga la consulta, se conectará a la instancia de mongod
.
Ahora mi problema es que tengo muchas (> 100) consultas simultáneas a diferentes bases de datos dentro de la misma instancia mongod
.
El controlador creó un montón de conexiones y mongod
me falló Too many files opened
porque hay demasiadas conexiones, incluso yo uso un solo mongo.Client
.
¿Es este un comportamiento adecuado de mongo_driver y cómo puedo lidiar con esto?
¿MongoDB requiere cada conexión por cada base de datos?
mongo.Connect()
crea un nuevo mongo.Client
y lo inicializa, pero (necesariamente) no crea conexiones con el servidor DB.
Para crear realmente una conexión y comprobar si se puede acceder al servidor (sin ejecutar una consulta), puede utilizar el método Client.Ping()
. Esto devolverá un error si no se puede acceder al servidor.
El controlador oficial de mongodb administra un grupo interno de conexiones. Las conexiones no se cierran inmediatamente después de su uso, sino que se vuelven a colocar en el grupo, de modo que cuando se necesita una conexión para realizar una operación, se puede usar una conexión inactiva del grupo inmediatamente. Este es el comportamiento previsto. Puede configurar su tamaño a través de options.ClientOptions
que pasa a mongo.Connect()
.
Ver ClientOptions.SetMaxPoolSize()
:
SetMaxPoolSize especifica el número máximo de conexiones permitidas en el grupo de conexiones del controlador a cada servidor. Las solicitudes a un servidor se bloquearán si se alcanza este máximo. Esto también se puede establecer a través de la opción URI "maxPoolSize" (p. ej., "maxPoolSize=100"). El valor predeterminado es 100. Si es 0, se establecerá en math.MaxInt64.
Ejemplo configurando un cliente con conexiones limitadas y haciendo ping:
ctx := context.Background() opts := options.Client(). ApplyURI("mongodb://localhost"). SetMaxPoolSize(20) // Allow no more than 20 connections per server client, err := mongo.Connect(ctx, opts) if err != nil { log.Printf("mongo.Connect() failed: %v", err) return } defer client.Disconnect(ctx) if err := client.Ping(ctx, nil); err != nil { log.Printf("Can't connect to db: %v", err) return } // Use client
Ver relacionado: goroutine crear múltiples conexiones mongodb