Pool de Conexiones MongoDB en Java Web

En la entrada anterior de Java, MongoDB y Morphia, di una pequeña introducción para usar esta librería.

Pero no dije cómo realizar la conexión. Simplemente dejé un enlace a la carpeta en SkyDrive.

En ella se encontraba una clase singleton para hacer la conexión.

Por qué tanto con la cosa singleton ? Resulta que en la documentación oficial de Mongo dicen claramente que lo mejor es realizar una conexión al servidor por cliente.

Resulta que buscando por aquí y por allá, descubrí que no es necesario hacer una🙂 El driver de Mongo para java (al menos en la versión 2.7.3) tiene una forma lista para usar😉

Para el ejemplo, voy a usar parte del código de un sistema que estoy haciendo.

Son 2 consultas, y nos va a servir para comprobar que realmente funciona.

Tengo una clase especial para las consultas a la BD (otra para ingresos, eliminaciones). En su constructor hago lo siguiente.

public MongoConsultas(){
   try{
       this.MURI = new MongoURI("mongodb://localhost:27017");
       this.conexion = Mongo.Holder.singleton().connect(MURI);
   }catch(Exception e){
       this.error = "No es posible conectar a BD:\n" + e.toString();
   }
} 

Como pueden ver, la magia es Mongo.Holder.singleton().connect(MURI);

Necesita de un MongoURI para conectarse y devuelve un objeto Mongo con la conexión lista.

La gracia de esto, es que basándose en la URI, nos devuelve un objeto nuevo si no se ha conectado, o uno que ya esté funcionando en caso de reconocerla.

Ahora veamos un ejemplo usando un Login de usuario.

Lo que hago es enviar datos desde el cliente al servidor y rescatar info para iniciar sesión. Luego, cierro la conexión.

1º Conexión

Como ven, el servidor Mongo acepta y responde. Luego en GlassFish (o servidor web/servlet) cierro la conexión.

Ahora, voy a cargar los datos de la persona que se acaba de conectar al sistema.

x_X

Error😯 ! Me dice que la conexión en el objeto Mongo se ha cerrado. Y en el servidor Mongo tampoco se ha realizado ninguna acción. Sigue estando con solo 1 conexión registrada.

Esto es porque en el Login creamos la primera conexión. Y en el mismo login la cerramos. Cuando se quiere conectar nuevamente, dice que no puede porque ya se ha cerrado.

La razón es el MongoURI !

Ahora, si sacamos el Mongo.Close() del Login veamos qué pasa.

2 Conexiones

Como vemos, el log muestra 2 conexiones. La primera al loguearse y la segunda al pedir los datos de la persona.

Es importante destacar que cada instancia de Mongo gestiona un pool de conexiones. Es por esto que se ven 2 conexiones en el log (siendo que estaríamos esperando solo 1), una por cada conexión en el pool.

El tamaño por defecto en cada pool es de 10, pero esto se puede cambiar en connectionsPerHost de la clase MongoOptions.

Además, cada instancia de Mongo mantiene en cache la instancia de la BD, por lo que no es necesario preocuparse de los singletons😉

Tampoco es necesario cerrar todas las conexiones en todos los lugares que abramos. Ya vimos que si hacemos esto, la siguiente conexión no podrá realizarse.

Lo único necesario es cerrar una sola vez (desde el Mongo único instanciado) para cerrar TODOS los sockets que tengamos en el pool de conexiones.

Espero les sirva, porque yo me volvía loco tratando de entender por qué el log me mostraba cerca de 50 conexiones abiertas x_X

Como ya saben, solo es eso🙂 Seguimos dentro del mismo pool, que corresponde a una única instancia de Mongo.

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Java, MongoDB, Tutoriales y etiquetada , . Guarda el enlace permanente.

Una respuesta a Pool de Conexiones MongoDB en Java Web

  1. Anónimo dijo:

    gvgvg

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s