java - getconnection - Conexión JDBC con reconexión automática
jdbc java ejemplo (3)
Estoy usando JDBC para conectarme a un servidor de base de datos. La conexión se realiza a través de una red inalámbrica y puede ser dudosa a veces. En el momento en que se pierde la conexión, necesito cerrar y reiniciar la aplicación.
¿Alguien tiene algunos ejemplos de código donde podría escribir algún tipo de envoltorio para reconectar automáticamente y volver a ejecutar la última consulta? Esto ahorraría muchas molestias.
Simplemente no estoy seguro de cómo debería / podría implementarse. Tal vez ya hay algo disponible?
Consulte las bibliotecas del conjunto de conexiones universales (UCP) de Oracle. Son totalmente compatibles con JDBC 4.0 e implementan la llamada isValid()
para comprobar si una conexión está activa. Es fácil hacer esta comprobación, en caso de reconexión falsa, luego ejecutar su consulta.
Página de descarga de Oracle UCP
Aunque sé que no preguntaste acerca de los grupos de conexiones, probablemente deberías utilizar uno de todos modos, así que esto te ayudará a duplicarlo.
Incluso si usa el conjunto de conexiones JDBC, ya sea el servidor de aplicaciones provisto o el pool común de Apache, vale la pena codificar una lógica de reintento. En función de la configuración de su servidor de aplicaciones, el servidor de la aplicación purgaría todas las conexiones agrupadas y recrearía un nuevo conjunto de conexiones. Aquí hay una muestra:
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//
// How many times do you want to retry the transaction
// (or at least _getting_ a connection)?
//
int retryCount = 5;
boolean transactionCompleted = false;
do {
try {
conn = getConnection(); // assume getting this from a
// javax.sql.DataSource, or the
// java.sql.DriverManager
retryCount = 0;
stmt = conn.createStatement();
String query = "Some sample SQL";
rs = stmt.executeQuery(query);
while (rs.next()) {
}
rs.close();
rs = null;
stmt.close();
stmt = null;
conn.close();
conn = null;
transactionCompleted = true;
} catch (SQLException sqlEx) {
//
// The two SQL states that are ''retry-able''
// for a communications error.
//
// Only retry if the error was due to a stale connection,
// communications problem
//
String sqlState = sqlEx.getSQLState();
if ("Substitute with Your DB documented sqlstate number for stale connection".equals(sqlState) ) {
retryCount--;
} else {
retryCount = 0;
}
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) {
// log this
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
// log this
}
}
if (conn != null) {
try {
//
// If we got here, and conn is not null, the
// transaction should be rolled back, as not
// all work has been done
try {
conn.rollback();
} finally {
conn.close();
}
} catch (SQLException sqlEx) {
//
// If we got an exception here, something
// pretty serious is going on, so we better
// pass it up the stack, rather than just
// logging it. . .
throw sqlEx;
}
}
}
} while (!transactionCompleted && (retryCount > 0));
}
Permita que un grupo de conexiones maneje esto para usted, muchos de ellos pueden validar una conexión. También lo hace DBPC, que tiene un parámetro testOnBorrow
que obliga a una verificación de cordura en cada conexión antes de ser utilizada. El valor predeterminado de este parámetro es true
, solo necesita validationQuery
para establecerse en una cadena no nula para que tenga algún efecto. ¡Así que establece la validationQuery
y listo! Mira la documentación .