Tenemos una aplicación de flujo de trabajo de Java que utiliza una base de datos Oracle para rastrear sus pasos e interacciones con otros servicios. Durante una ejecución del flujo de trabajo, se realizan varias inserciones/actualizaciones/selecciones y ocasionalmente la selección no devolverá los datos actualizados, aunque la confirmación de inserción/actualización se ejecutó antes de que se completara correctamente. Después de que se produzcan errores en el flujo de trabajo (debido a los datos incorrectos), si volvemos atrás y verificamos la base de datos a través de una aplicación de terceros, se mostrarán los datos nuevos/actualizados. Parece haber un desfase entre el momento en que se cumplen nuestros compromisos y cuándo son visibles. Esto ocurre en aproximadamente el 2% de todas las ejecuciones de flujo de trabajo y aumenta durante el uso intensivo de la base de datos.Oracle lag entre commit y select
Nuestro equipo de soporte de base de datos sugirió cambiar un parámetro max-commit-propagation-delay a 0, ya que de manera predeterminada era 700. Esto parecía ser una solución posible pero al final no solucionó nuestro problema.
La aplicación se ejecuta en WebSphere y la base de datos Oracle está configurada como un origen de datos JDBC. Estamos usando Oracle 10.1g. La aplicación está escrita en Java 1.5.
Cualquier ayuda sería apreciada.
edición: ejemplo de código
DataSource ds; // spring configured
String sql = "INSERT INTO " + currentTable + " (" + stepId + ',' + stepEntryId + ", " + stepStepId + ", " + stepActionId + ", " + stepOwner + ", " + stepStartDate + ", " + stepDueDate + ", " + stepFinishDate + ", " + stepStatus + ", " + stepCaller + ") VALUES (?, ?, ?, null, ?, ?, ?, null, ?, null)";
Connection conn = ds.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
// set values
stmt.executeUpdate();
// close connections
// later on in the code...
Connection conn = ds.getConnection();
PreparedStatement stmt = null;
ResultSet rset = null;
String sql = "SELECT " + stepId + ", " + stepStepId + ", " + stepActionId + ", " + stepOwner + ", " + stepStartDate + ", " + stepDueDate + ", " + stepFinishDate + ", " + stepStatus + ", " + stepCaller + " FROM " + currentTable + " WHERE " + stepEntryId + " = ?";
stmt = conn.prepareStatement(sql);
stmt.setLong(1, entryId);
rset = stmt.executeQuery();
//close connections
En [Documentación de Oracle] (http://download.oracle.com/docs/cd/B14117_01/server.101/b10755/initparams115.htm), parece que el parámetro 'max_commit_propagation_delay' solo se aplica a la configuración de RAC. ¿Te estás conectando a una instancia de RAC? –
¿Los datos se están comprometiendo como parte de una transacción? O la lectura? –