Mamy aplikację przepływu pracy Java, która korzysta z bazy danych Oracle do śledzenia jej kroków i interakcji z innymi usługami. Podczas przepływu pracy wykonywanych jest kilka operacji insert/update/select, a od czasu do czasu select nie zwróci zaktualizowanych danych, nawet jeśli zatwierdzenie insert/update, które zostało uruchomione, zanim zostało pomyślnie zakończone. Po usunięciu błędów przepływu pracy (z powodu złych danych), jeśli wrócimy i sprawdzimy bazę danych za pośrednictwem aplikacji innej firmy, pojawią się nowe/zaktualizowane dane. Wydaje się, że występuje opóźnienie między momentem, w którym popełniane są nasze zobowiązania i kiedy są one widoczne. Dzieje się to w około 2% wszystkich przepływów pracy i zwiększa się podczas intensywnego korzystania z bazy danych.Opóźnienie Oracle między zatwierdzeniem i wybraniem
Nasz zespół wsparcia bazy danych zaproponował zmianę parametru max-commit-propagation-delay na 0, ponieważ domyślnie był ustawiony na 700. Wydaje się, że jest to możliwe rozwiązanie, ale ostatecznie nie rozwiązało problemu.
Aplikacja działa w środowisku WebSphere, a baza danych Oracle jest skonfigurowana jako źródło danych JDBC. Używamy Oracle 10.1g. Aplikacja napisana jest w Javie 1.5.
Każda pomoc zostanie doceniona.
edit: przykładowy kod
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
Z [Dokumentacja Oracle] (http://download.oracle.com/docs/cd/B14117_01/server.101/b10755/initparams115.htm) wynika, że parametr 'max_commit_propagation_delay' ma zastosowanie tylko do konfiguracji RAC. Czy łączysz się z instancją RAC? –
Czy dane są zatwierdzane jako część transakcji? Lub czytać? –