La semana pasada me encontré con un problema en el entorno de desarrollo, el pool de conexiones de Oracle. El problema en concreto es que el pool se llena demasiado rápido y hay que estar reiniciando Oracle constantemente. Por defecto Oracle admite 20 conexiones de pool, aunque este valor se puede incrementar.
¿Pero que pasa si hay varias máquinas de desarrollo (tomcat + eclipse) apuntando al mismo oracle? Pues que aunque subamos el pool al final del día vuelve a estar lleno y es necesario vaciarlo.
La forma bonita sería entrar como SYSDBA y ejecutar:
SYS as SYSDBA: SQL> EXEC DBMS_CONNECTION_POOL.stop_pool; SQL> EXEC DBMS_CONNECTION_POOL.start_pool;
Pero claro, ¿qué ocurre si no tenemos el password del usuario? ¿ o si no están los listener necesarios configurados? ¿o simplemente si queremos hacerlo "de otra forma" pero que sea más rápida?.
Mi solución ha sido un poco bestia, como matar moscas a cañonazos, pero efectiva.
Viendo los procesos del sistema
ps aux|grep oracle
me di cuenta de había procesos con la nomenclatura oracle+SID, en mi caso oracleorcl.
ps aux|grep oraceorcl
Por tanto se pueden matar procesos a mano (kill -9) para liberar pool. Pero claro, 20 ó 30 procesos a mano es un poco pesado. Googleando un poco y combinando post nos sacamos de la manga el comando:
ps aux|grep oracleorcl| awk '{print $2}' |xargs kill –KILL
y matamos a todos de golpe :D
Lo malo es que tiramos las conexiones activas (vamos, que podemos joder al personal), así que hay que avisar a los compañeros antes, pero es un mal menor.
Y la pregunta clave, ¿todo esto para qué? Pues simplemente ganamos un poco te tiempo y ya no es necesario reiniciar Oracle, y porque me divirtió investigar este tema, por supuesto ;D
saludos
No hay comentarios:
Publicar un comentario