Abbiamo un'applicazione di flusso di lavoro Java che utilizza un database Oracle per tracciare i passaggi e le interazioni con altri servizi. Durante un flusso di lavoro vengono eseguiti diversi inserimenti/aggiornamenti/selezioni e occasionalmente la selezione non restituirà i dati aggiornati, anche se il commit di inserimento/aggiornamento è stato eseguito prima del completamento corretto. Dopo che gli errori del flusso di lavoro sono usciti (a causa di dati errati), se torniamo indietro e controlliamo il database tramite un'app di terze parti, i dati nuovi/aggiornati verranno visualizzati. Sembra esserci un ritardo tra quando i nostri commit passano e quando sono visibili. Ciò si verifica in circa il 2% di tutte le esecuzioni del flusso di lavoro e aumenta durante l'utilizzo intensivo del database.Oracle lag tra commit e select
Il nostro team di supporto del database ha suggerito di modificare un ritardo max-commit-propagazione del parametro su 0, in quanto predefinito a 700. Questa sembrava essere una possibile soluzione ma alla fine non ha risolto il nostro problema.
L'applicazione viene eseguita su WebSphere e il database Oracle è configurato come origine dati JDBC. Stiamo usando Oracle 10.1g. L'applicazione è scritta in Java 1.5.
Qualsiasi aiuto sarebbe apprezzato.
edit: esempio di codice
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
Dalla [Documentazione Oracle] (http://download.oracle.com/docs/cd/B14117_01/server.101/b10755/initparams115.htm), sembra che il parametro 'max_commit_propagation_delay' valga solo per l'impostazione RAC. Ti stai connettendo a un'istanza RAC? –
I dati vengono dati come parte di una transazione? O la lettura? –