java - and - ¿Cómo es maxIdleTimeExcessConnections diferente de maxIdleTime en c3p0?
hibernate connection pool size (2)
Quiero configurar mi grupo de conexiones c3p0 para que al menos 2 conexiones estén siempre activas, como máximo 5, y las conexiones inactivas después de las 2 primeras caducarán en un tiempo razonable (digamos una hora).
Todo esto suena sencillo, excepto que la documentación parece implicar que no hay diferencia entre las funciones maxIdleTime
y maxIdleTimeExcessConnections
, lo cual me confunde.
Estados de configuración de grupo básico :
Dentro del rango entre minPoolSize y maxPoolSize, la cantidad de conexiones en un grupo varía según los patrones de uso. El número de conexiones aumenta cada vez que un usuario solicita una conexión, no hay conexiones disponibles y el grupo aún no ha alcanzado maxPoolSize en la cantidad de conexiones administradas. Como la adquisición de Connection es muy lenta, casi siempre es útil aumentar el número de conexiones con entusiasmo, en lotes, en lugar de forzar a cada cliente a esperar que una nueva conexión provoque una única adquisición cuando la carga está aumentando. acquireIncrement determina cuántas conexiones intentará adquirir un grupo c3p0 cuando el grupo se haya quedado sin conexiones. (Independientemente de acquireIncrement, la agrupación nunca permitirá que se exceda maxPoolSize).
Y el uso de minPoolSize
:
Número mínimo de conexiones que un grupo mantendrá en un momento dado.
Bien, excelente. Y para configurar el tiempo de conexión:
maxIdleTimeExcessConnections se trata de minimizar la cantidad de conexiones mantenidas por las agrupaciones c3p0 cuando la agrupación no está bajo carga. De forma predeterminada, las agrupaciones c3p0 crecen bajo carga, pero solo se reducen si las conexiones fallan en una prueba de conexión o caducan a través de los parámetros descritos anteriormente. Algunos usuarios quieren que sus pools liberen conexiones innecesarias rápidamente después de un aumento en el uso que obliga a un tamaño de grupo grande. Puede lograr esto estableciendo maxIdleTimeExcessConnections en un valor mucho más corto que maxIdleTime, forzando a las conexiones más allá de su tamaño mínimo a ser liberadas si permanecen inactivas por más de un período corto de tiempo.
Por lo tanto, se da a entender que minPoolSize
solo importa cuando se utiliza junto con maxIdleTimeExcessConnections
; de lo contrario, solo se ignorará por completo.
Al corroborar la documentación de maxIdleTime
no se menciona a minPoolSize
:
Segundos una conexión puede permanecer agrupada pero no utilizada antes de ser descartada. Cero significa que las conexiones inactivas nunca caducan.
Y maxIdleTimeExcessConnections
tiene sentido:
Número de segundos que se debe permitir que las conexiones que excedan minPoolSize permanezcan inactivas en la agrupación antes de ser eliminadas. Destinado a aplicaciones que desean minimizar agresivamente el número de conexiones abiertas, reduciendo la agrupación hacia minPoolSize si, después de un pico, el nivel de carga disminuye y las conexiones adquiridas ya no son necesarias. Si se establece maxIdleTime, maxIdleTimeExcessConnections debería ser más pequeño para que el parámetro tenga algún efecto. Cero significa que no hay aplicación, el exceso de conexiones no están inactivas.
Me parece realmente extraño que minPoolSize
, una característica básica, solo importe cuando se usa con lo que me parece una característica más avanzada. ¿Esto es todo correcto?
¡Qué lectura cuidadosa y leída de abogado!
pero no, no es correcto
hay varias maneras en que una Conexión puede morir. como citas:
Las agrupaciones c3p0 ... se contraen si las conexiones fallan en una prueba de conexión o caducan a través de los parámetros descritos anteriormente.
los "parámetros descritos anteriormente" incluyen maxConnectionAge
, maxIdleTime
y maxIdleTimeExcessConnections
. Las conexiones también se pueden eliminar del grupo porque fallan las pruebas de conexión mientras están inactivas (ver idleConnectionTestPeriod
), porque fallan las pruebas de check-in o de check-out ( testConnectionOnCheckin
, testConnectionOnCheckout
), o porque fallan las pruebas activadas por una excepción en el curso de uso del cliente
sin embargo, una agrupación se reduce, minPoolSize
importa, porque si la agrupación se reduce por debajo de minPoolSize
, las Conexiones destruidas se reemplazarán hasta que se restablezca minPoolSize
.
lo que es único de maxIdleTimeExcessConnections
es que su comportamiento depende directamente del tamaño del grupo en relación con minPoolSize
. todos los demás parámetros y pruebas simplemente hacen lo suyo. si lo que sucede hace que el grupo minPoolSize
a algo inferior a minPoolSize
, entonces c3p0 automáticamente traerá el grupo de vuelta a minPoolSize
. pero maxIdleTimeExcessConnections
es diferente. solo tiene algún efecto cuando el grupo es mayor que minPoolSize
.
como dices, maxIdleTimeExcessConnections
es una función avanzada. la mayoría de los usuarios nunca lo usan y nunca lo necesitan. se agregó porque algunos usuarios querían obligar a las agrupaciones a reducirse a minPoolSize, pero hacerlo con un tiempo maxIdleTime
incondicional maxIdleTime
provoca un maxIdleTime
innecesario a través de las conexiones, ya que las conexiones incluso en un grupo minPoolSize
y se reemplazan constantemente. establecer un maxIdleTime
largo o inexistente, mientras que establecer un maxIdleTimeExcessConnections
corto produce el resultado deseado de reducción rápida y agresiva sin agitar a través de Connections una vez que el conjunto llega a minPoolSize
.
pero incluso sin el conjunto minPoolSize
, minPoolSize
importa mucho. Las conexiones se destruyen y eliminan del grupo, y minPoolSize
determina un umbral por debajo del cual las Conexiones destruidas se reemplazarán automáticamente, incluso si la carga del cliente no llega a provocar la expansión del grupo.
¡Espero que esto tenga sentido!
Buena respuesta de Steve Walkdman, solo quiero agregar una respuesta breve:
La diferencia es que maxIdleTime reemplazará las conexiones inactivas incluso en minPoolSize
-d pools, mientras que maxIdleTimeExcessConnections
no lo hará.