2011-07-22 48 views
27

Razones para java.sql.SQLException: ¿conexión cerrada desde Oracle?Oracle DB: java.sql.SQLException: conexión cerrada

java.sql.SQLException: Conexión cerrada en oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:112) en oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:146) en oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:208) en oracle.jdbc.driver.PhysicalConnection.commit (PhysicalConnection.java:1131) en oracle.jdbc.OracleConnectionWrapper.commit (OracleConnectionWrapper.java: 117)

Estamos obteniendo este error del error o Ver la conexión de la base de datos Usamos el mismo código para otras bases de datos también. Pero al ver este problema con solo una de las bases de datos. ¿Esto se debe a que la conexión podría tener un tiempo de espera debido al largo período de inactividad y estamos intentando usar eso? Pls, hágamelo saber si usted necesita más detalles ...

AbandonedConnectionTimeout establece en 15 minutos InactivityTimeout establecido en 30 minutos

Respuesta

32

significa que la conexión se ha establecido con éxito en algún momento, pero cuando se trató de cometer allí , la conexión ya no estaba abierta. Los parámetros que mencionaste suenan como la configuración del grupo de conexiones. Si es así, no están relacionados con este problema. La causa más probable es un firewall entre usted y la base de datos que está matando las conexiones después de una cierta cantidad de tiempo de inactividad. La solución más común es hacer que su grupo de conexiones ejecute una consulta de validación cuando se desprotege una conexión. Esto identificará y expulsará inmediatamente las conexiones muertas, asegurando que solo obtenga buenas conexiones del grupo.

+0

gracias por la respuesta. ¿La propiedad de conexión de validación agrega alguna sobrecarga? Estoy viendo esto solo con uno de los DB, también dudo que haya algún problema con ese DB particular. –

+4

Naturalmente, agregará algunos gastos generales, ya que tiene que llegar a la base de datos para validar la conexión; sin embargo, cada base de datos tiene una "consulta de validación" recomendada para usar que implica una sobrecarga mínima en el lado de la base de datos, por lo que la única desaceleración que obtendrá es de la latencia de red que exista. Independientemente del problema, agregar una consulta de validación es una forma bastante infalible para evitar conexiones inactivas del grupo. Creo que la consulta recomendada actual para Oracle es 'seleccionar 1 de dual' –

8

Tienes que validar la conexión.

Si utiliza Oracle, es probable que utilice el Universal Connection Pool de Oracle. Lo siguiente asume que lo haces.

La forma más fácil de validar la conexión es decirle a Oracle que la conexión debe validarse al tomarla prestada. Esto se puede hacer con

pool.setValidateConnectionOnBorrow(true); 

Pero funciona solo si mantiene la conexión por un período corto. Si tomas prestada la conexión por un tiempo más largo, es probable que la conexión se rompa mientras la sostienes. En ese caso, usted tiene que validar la conexión explícita con

if (connection == null || !((ValidConnection) connection).isValid()) 

Véase el Oracle documentation para más detalles.

+0

Si no puedes usar UCP o no quieres lidiar con el dolor de cabeza de los artefactos de Oracle que no están disponibles en los repositorios de maven públicos, recientemente descubrí que java.sql.Connection tiene un método isValid. Funciona en un tiempo de espera. – obesechicken13

+0

y oracle.ucp.jdbc.ValidConnection's isValid hace que mi logger programado se bloquee en una java.lang.ClassCastException – obesechicken13

Cuestiones relacionadas