Вы действительно зависите от поддержки этой базы данных. Вам также необходимо учитывать накладные расходы. Множество вставок/обновлений также означает много уведомлений, и ваш Java-код должен обрабатывать их последовательно, иначе он будет пузыриться.
Если это позволяет датемодель, просто добавьте дополнительный столбец, который содержит временную метку, которая обновляется при каждой вставке/обновлении. Большинство основных БД поддерживают автоматическое обновление столбца при каждом вставке/обновлении.Я не знаю, какой сервер БД вы используете, так что я дам только MySQL целенаправленный примера:
CREATE TABLE mytable (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
somevalue VARCHAR(255) NOT NULL,
lastupdate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX (lastupdate)
)
Таким образом, вам не нужно беспокоиться о вставке/обновлении в lastupdate
себя. Вы можете просто сделать INSERT INTO mytable (somevalue) VALUES (?)
или UPDATE mytable SET somevalue = ? WHERE id = ?
, и БД сделает магию.
Убедившись, что время сервер БД и времени Java приложения являются такими же, вы можете просто стрелять фоновый поток (с использованием либо Timer
с TimerTask
или ScheduledExecutorService
с Runnable
или Callable
), который делает примерно так:
Date now = new Date();
statement = connection.prepareStatement("SELECT id FROM mytable WHERE lastupdate BETWEEN ? AND ?");
statement.setDate(1, this.lastTimeChecked);
statement.setDate(2, now);
resultSet = statement.executeQuery();
while (resultSet.next()) {
// Handle accordingly.
}
this.lastTimeChecked = now;
Обновление: согласно обновлению вопроса выясняется, что у вас нет контроля над БД. Ну, тогда у вас нет хороших/эффективных вариантов. Либо просто обновите весь список в Java-памяти целыми данными из БД без проверки/сравнения изменений (возможно, самого быстрого способа) или динамического создания SQL-запроса на основе текущих данных, что исключает текущие данные из результатов.
Обновление копируется спамом с обмана: http://stackoverflow.com/questions/2363697/database-polling-using-java-closed – BalusC
Возможно, данные об изменении данных Oracle могут быть получены? –
Только если вы работаете с Oracle DB: [http://stackoverflow.com/questions/21177723/how-to-call-java-class-from-oracle-trigger](http://stackoverflow.com/ вопросы/21177723/how-to-call-java-class-from-oracle-trigger) –