Mantener viva una conexión JDBC de Oracle

17/12/2013

oracle linux support
El Cliente Oracle utiliza la funcionalidad TCP KeepAlive del Sistema Operativo (en mi caso Linux).

Para habilitar el uso de esta característica en el Cliente Oracle hay que especificar el parámetro ENABLE=BROKEN en la cláusula DESCRIPTION del descriptor de conexión. Por ejemplo:


jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS=(PROTOCOL=tcp)(PORT=1521)(HOST=myhost))(CONNECT_DATA=(SID=orcl)))

Ahora podemos comprobar los valores actuales de keepalive del kernel:


# sysctl -a | grep keepalive
net.ipv4.tcp_keepalive_time = 7200 # enviar el primer keepalive tras 7200 segundos (2h)
net.ipv4.tcp_keepalive_intvl = 75 # tras el primer keepalive, enviar keepalives cada 75 segundos
net.ipv4.tcp_keepalive_probes = 9 # matar conexión tras 9 keepalives fallidos

Y ajustarlos según nuestras necesidades:


# sysctl -w net.ipv4.tcp_keepalive_time=60
# echo "net.ipv4.tcp_keepalive_time = 60" >> /etc/sysctl.conf
# sysctl -w net.ipv4.tcp_keepalive_intvl=90
# echo "net.ipv4.tcp_keepalive_intvl = 90" >> /etc/sysctl.conf
# sysctl -w net.ipv4.tcp_keepalive_probes=3
# echo "net.ipv4.tcp_keepalive_probes = 3" >> /etc/sysctl.conf

Una vez hecho esto, y establecida una nueva conexión jdbc, podremos comprobar si ahora keepalive está habilitado para dicha conexión (utiliza “netstat -tpno” y comprueba las dos últimas columnas donde aparecerá la palabra “keepalive” y el tiempo correspondientes de los temporizadores)

# netstat -tnpo
tcp 0 0 192.168.1.1:54729 192.168.2.2:1521 ESTABLISHED 26988/java keepalive (1530.03/0/0)
tcp 0 0 192.168.1.1:54718 192.168.2.2:1521 ESTABLISHED 26944/httpd keepalive (1522.62/0/0)

NOTA: El equivalente en Windows para configurar los parámetros KeepAlive, es utilizar Regedt32.exe para modificar el registro del sistema.

Añade o modifica las siguientes entradas bajo (reinicia una vez completado para que los nuevos valores tengan efecto)

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters:

  • KeepAliveTime: REG_DWORD = 7200000 (2 horas)
  • KeepAliveInterval: REG_DWORD = 1000 (1 segundo)
  • TcpMaxDataRetransmissions: REG_DWORD = 5

NOTA 2: Si está utilizando SQLDeveloper, no podrás definir la URL de conexión JDBC ya que la aplicación la crea a partir de los parámetros introducidos en la ventana de configuración de la conexión. La forma de poder especificar el parámetro ENABLE=BROKEN es definir la conexión mediante el tnsnames.ora.

En SQLDeveloper vete a Tools –> Preferences

SQLDeveloper Preferences

En las opciones de Preferences expande Database –> selecciona Advanced –> bajo “Tnsnames Directory” –> navega al directorio donde tengas el tnsnames.ora.

SQLDeveloper Advanced

Pulsa Ok.

Ahora te puedes conectar mediante las opciones TNSnames.

Algunos enlaces de interés
TCP Keepalive HOWTO
Keepalive for Database Connections?
Oracle JDBC Connection KeepAlive
Oracle® Database JDBC Developer’s Guide
Jdbc, TCP channels and other funny dudes…
Use tnsnames.ora in Oracle SQL Developer
Archivos de configuración de la red Oracle
Enabling TCP/IP KeepAlive on Windows
Linux settings for high load systems

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

A %d blogueros les gusta esto: