У нас есть приложение рабочего процесса Java, которое использует базу данных Oracle для отслеживания своих шагов и взаимодействия с другими сервисами. Во время выполнения рабочего процесса выполняется несколько операций вставки / обновления / выбора, и время от времени выборка не возвращает обновленные данные, даже если фиксация вставки / обновления выполнялась до ее успешного завершения. После выхода ошибок рабочего процесса (из-за неверных данных), если мы вернемся и проверим базу данных через стороннее приложение, появятся новые / обновленные данные. Кажется, что существует задержка между тем, когда наши коммиты проходят и когда они видны. Это происходит примерно в 2% всех рабочих процессов и увеличивается при интенсивном использовании базы данных.
Наша группа поддержки баз данных предложила изменить параметр max-commit-пропаганда-delay на 0, так как он по умолчанию равен 700. Это казалось возможным решением, но в конечном итоге не решило нашу проблему.
Приложение работает в WebSphere, а база данных Oracle настроена как источник данных JDBC. Мы используем Oracle 10.1g. Приложение написано на Java 1.5.
Любая помощь будет оценена.
редактировать: пример кода
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