rdbms - para - que es un connection pool
¿Cómo configuras tu grupo de conexiones? (6)
¿Por qué reinventar la rueda?
Alguien ya probablemente ha resuelto el problema, y mejor.
Si estás en el mundo de Java, puedes usar Commons DBCP .
¿Cuál es la mejor manera de configurar su grupo con respecto a:
- ¿Cuándo creas conexiones?
- ¿Cuándo cierras las conexiones y las cierras todas?
- ¿Pruebas que las conexiones siguen siendo buenas? ¿Cuando y cómo?
- ¿Cómo se puede encontrar un buen número para la cantidad máxima de conexiones?
- ¿Qué tipo de monitoreo tiene para garantizar que los usuarios de la agrupación se porten bien? ¿Puedes evitar que un mal código saque todo?
- ¿Has escrito tu propio grupo o has usado una biblioteca de terceros?
Creo que esta es una pregunta agnóstica, pero los comentarios sobre "características" de bases de datos / idiomas particulares son bienvenidos. Por ejemplo, puede ser más lento o más costoso conectarse en algunas bases de datos que otros.
Para aclarar, no tengo la intención de escribir un grupo desde cero, esta pregunta es más acerca de cómo configurar una biblioteca existente que hace la agrupación.
Jakarta Commons DBCP ya hace todas las cosas que enumeró:
- crea conexiones según sea necesario y las gestiona en un grupo
- puede cerrar las conexiones si no se han usado durante un cierto período de tiempo
- puede ejecutar una consulta en una conexión antes de distribuirla, y si hay un error, la conexión se descarta y se crea una nueva. Las conexiones también se pueden probar periódicamente mientras está inactivo.
- puede establecer un límite en las conexiones que se crearán y también en el número mínimo de conexiones para tener listo. El límite de curso depende mucho de tu aplicación.
- No sé cómo pero DBCP sabe cuándo no se cierra una conexión y la cierra para ti, lanzando una excepción para que sepas qué sucedió cuando ves tu registro.
- DBCP tiene un parámetro de tiempo de espera que es muy útil. Si se utilizan todas las conexiones del grupo, esperará ese período de tiempo para que se devuelva una conexión al grupo y si no hay ninguna disponible cuando se alcanza el límite, obtendrá un error.
Puede ajustar su grupo jugando con la cantidad mínima de conexiones, el número máximo de conexiones que se crearán y el tiempo de espera. Un tiempo de espera más largo le permitirá tener un límite inferior de conexiones, mientras que un tiempo de espera más corto probablemente requerirá un número mayor. Esto depende en gran medida de lo que hace su aplicación y cómo utiliza las conexiones.
Escribí un grupo de conexiones para la base de datos en Java cuando era solo un patrón de diseño y no una biblioteca común. Ahora uso el integrado en Tomcat.
Usé un hilo para monitorear varios aspectos del grupo y varios parámetros para controlar su comportamiento ...
- minimumInPool = "3" ... Estos tres primeros se crean después del lanzamiento. Nunca se permite que la agrupación caiga por debajo de tres.
- maximumIdleTimeBeforeRemoval = "60" ... Si una conexión está inactiva durante una hora, suéltela y cree una nueva. El tiempo de inactividad probablemente significa que solo hay un mínimo de tres en el grupo.
- maximumInUseTimeBeforeRemoval = "30" ... Si se ha verificado una conexión determinada durante más de 30 minutos, entonces es probable que algo esté mal. Recuérdelo y mate la conexión.
- maximumTimeBeforeRemoval = "60" ... Quítelo si tiene más de 60 minutos de antigüedad.
- maximumUsageBeforeRemoval = "1000" ... Quítelo si se ha revisado más de 1000 veces.
- monitorInterval = "15" ... Verifique los parámetros anteriores cada 15 minutos.
Esto me sirvió muy bien durante un par de años. Lo más que he visto en la piscina fue 151 conexiones durante un vistazo salvaje. Por lo general, el grupo estaba en alrededor de una docena durante el uso intensivo y estaba inactivo hasta el mínimo de tres en la madrugada.
Utilicé los controladores delgados JDBC de Oracle y me conecté a una base de datos Oracle.
No estoy seguro de cuál es el contexto en el que está utilizando sus conexiones, pero puedo compartir lo que parece funcionar para mí.
Utilizo el servidor SQL como mi back-end y uso una combinación de almacenamiento en caché para obtener un mejor rendimiento. Mi práctica es mantener la conexión abierta solo si realmente la necesito y no agrupar las conexiones para que se puedan limpiar de inmediato y puedo ver en el Monitor de actividad de SQL exactamente qué está activo y qué no. Cada conexión ocupa memoria, por lo que es agradable mantenerla en un rugido sordo cuando no se necesitan.
Antes de responder a la pregunta de apertura y cierre de la conexión, permítanme decir que el almacenamiento en caché es realmente importante. Obtener un objeto de la memoria caché le ahorrará un montón de tiempo. En algunas de mis aplicaciones asp.net cuando el almacenamiento en caché está en desarrollo, he descubierto que apenas puedo medir la latencia, mientras que con una llamada al DB puede llevar de 15ms a 45ms completar la llamada y esto ni siquiera está considerando otra latencia factores o carga. El otro método que uso es una buena estructura de objetos para mis datos, de modo que solo realizo una actualización de DB si algo cambia. Implementé algunos métodos en mi objeto o me aseguro de estar haciendo tan poco IO como sea posible.
Dicho esto, todos sabemos que necesitamos acceder y escribir en nuestro DB en algún momento, así que sigo dos principios:
Mantenga las puertas y ventanas cerradas para ahorrar energía. Una conexión abierta en un lugar significa que no está disponible en otro (o la memoria y otros recursos son más limitados). Hemos desactivado la agrupación porque ha resultado en un mejor rendimiento para nosotros.
Hago tanto por lotes como a la vez cuando puedo cuando la conexión está abierta. Esto es un poco más complicado, así que déjame explicarte.
- Un método que he usado es pasar mis objetos de conexión por la tubería para que todos los objetos puedan usar un objeto de conexión. Esto da como resultado que una conexión se abra y se cierre en lugar de tal vez 10 o más según su aplicación. Un buen ejemplo de esto es uno de nuestros modelos de compras que aprovecha el poder del servidor SQL para recopilar estadísticas y organizar patrones de pedidos complicados. No tiene sentido seguir abriendo y cerrando la conexión cuando estás haciendo una búsqueda de 200K + DB o para lo que sean las aplicaciones. La otra parte de esto es que cuando uso el objeto intento agrupar mis actualizaciones para reducir el tiempo que mantengo la conexión abierta. Así que al hacer una scope_identity en la llamada de inserción, vamos a ocuparme tanto de mi inserción como de la búsqueda de la ID única para agregar a mi objeto antes de almacenarlo en la memoria caché. Antes, cuando comencé a desarrollar aplicaciones asp, abría la conexión tan pronto como la página comenzaba a cargarse y luego la cerraba. No recomiendo hacer eso nunca más. Ahora, un día, hay un gran beneficio para este tipo de abstracciones y capas que recomendaría a cualquier programador novato que preste especial atención.
Mis dos centavos:
¡Guarde sus datos en caché! ¡Guarde sus datos en caché! ¡Guarde sus datos en caché! ¡Haga el menor acceso posible a la base de datos cuando no pueda almacenar en caché y luego almacenar en caché sus datos!
Aquí está el razonamiento que utilicé para una implementación reciente.
Tenga dos tipos de conexiones en su grupo de conexiones. El primero está listo, es decir, abierto pero no utilizado por un cliente. El segundo está activo, es decir, en uso por un cliente.
Haga que su agrupación de conexiones mantenga un número pequeño de conexiones listas, se puede ajustar un mínimo de N y un máximo de M. N dependiendo de la velocidad máxima a la que sus clientes soliciten conexiones. Si el número de conexiones listas cae alguna vez a cero, necesita una N. más grande. Si el número es constantemente alto (digamos arriba de 10), necesita una N más baja.
Cuando un cliente quiere una conexión, dele una de las listas (activada) e inmediatamente abra una nueva si ya hay menos de N lista (pero no haga que el cliente espere hasta que se complete). perderá la ventaja de la puesta en común). Esto asegura que siempre habrá al menos N conexiones preparadas. Si ninguno está listo cuando el cliente quiere uno, tendrán que esperar mientras usted crea uno nuevo.
Cuando el cliente finaliza con una conexión activa, regrésela al estado listo si hay menos de M conexiones preparadas. De lo contrario, ciérralo. Esto le impide tener más de M conexiones preparadas.
Periódicamente, recicle las conexiones listas para evitar conexiones obsoletas. Si hay más de N conexiones preparadas, solo cierre la conexión más antigua. De lo contrario, ciérrelo y vuelva a abrir otro.
Esto tiene la ventaja de tener suficientes conexiones listas y jóvenes disponibles en su grupo de conexiones sin sobrecargar el servidor.
Estoy de acuerdo con matt b en que no debemos reinventar la rueda.
Sin embargo, el uso de Commons DBCP es discutible en función de las respuestas de esta y las preguntas. Hay mejores alternativas mencionadas allí como c3po o proxool .
O puede usar el mecanismo de agrupación de conexiones dependiente de rdbms.