2008-11-08 8 views
6

¿Cómo verifico si hay una conexión abierta en jdbc para la base de datos oráculo?comprobando mediante programación la conexión abierta en JDBC

Nota: conn.isClosed() no se puede utilizar para esto.

+0

¿Quieres saber si su aplicación tiene una conexión abierta o quiere saber si el PP tiene una conexión abierta a cualquier cosa. – sblundy

+0

Quiero implementar el grupo de conexiones. –

+0

échale un vistazo [Estado de conexión Java JDBC] (http://stackoverflow.com/a/30888132/782535) –

Respuesta

2

Por lo general, un grupo de conexión también utilizará el método Connection.isClosed() para comprobar si la conexión sigue siendo válida. El problema es que no todos los controladores JDBC manejarán esta llamada correctamente. Así que supongo que hay algunas declaraciones de verificación simples como dijo RealHowTo. Para Oracle ya mencionó el "SELECT 1 FROM Dual" que debería tener éxito siempre para las bases de datos Oracle. Creo que hay consultas similares para la base de datos diferente. Puedo recordar que en un proyecto anterior también implementamos un grupo de conexiones propio que utilizaba tales consultas de validación.

8

Algo así como:

Statement stmt = null; 
ResultSet rs =null; 
try { 
    stmt = conn.createStatement(); 
    // oracle 
    rs = stmt.executeQuery("SELECT 1 FROM Dual"); 
    // others 
    // rs = stmt.executeQuery("SELECT 1"); 
    if (rs.next()) 
     return true; // connection is valid 
} 
catch (SQLException e) { 
    // TODO : log the exception ... 
    return false; 
} 
finally { 
    if (stmt != null) stmt.close(); 
    if (rs != null) rs.close(); 
} 

Tenga en cuenta que si la conexión está viniendo de un pool de conexiones (en un servidor de aplicaciones, por ejemplo), entonces la piscina puede tener un mecanismo para comprobar si una conexión es válida o no. Con BEA, especifica el SELECCIONAR en la propiedad "test-on-reserve".

Si está desarrollando su propio grupo, entonces es posible que desee echar un vistazo a cómo lo están haciendo otros (por ejemplo, Proxool).

+0

Dependiendo de su entorno, su grupo de conexiones DEBERÍA comprobar la conexión. De lo contrario, si pierde la conectividad con el DB, normalmente debe reiniciar su servidor de aplicaciones para reiniciar el grupo. –

+0

Sospecho fuertemente que executeQuery arrojará una SQLException si la conexión está cerrada. –

1

Ver this publicación.

Las soluciones a las que se hace referencia son similares a la que se publica aquí (consulta rápida contra DUAL para validar) pero también hay una solución interesante proporcionada por JBoss específica para Oracle utilizando el método propietario PING en la clase Oracle JDBC Connection. Vea el código here.

// Nicholas

+0

Tenga en cuenta que todo lo que hace pingDatabase (int) en el controlador Tipo IV es "seleccionar 'x' desde dual;" – leonigmig

1

Uso pingDatabase(int timeout) Implementado en OracleConnection desde 9.0.1

+0

Tenga en cuenta que toda la base de datos de ping (int) en el controlador de tipo IV es una "selección" x "de dual;" – leonigmig

Cuestiones relacionadas