In effetti, dipende dal fatto che il database in questione lo supporti. Dovrai anche prendere in considerazione il sovraccarico. Molti degli inserimenti/aggiornamenti significano anche molte notifiche e il tuo codice Java deve gestirli in modo coerente, altrimenti si riempirà di bolle.
Se il modello dati lo consente, è sufficiente aggiungere una colonna aggiuntiva contenente un timestamp che viene aggiornato su ogni inserimento/aggiornamento. La maggior parte dei DB principali supporta un aggiornamento automatico della colonna su ogni inserimento/aggiornamento.Non so quale server di DB che si sta utilizzando, quindi darò solo un esempio MySQL mirato:
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)
)
In questo modo non c'è bisogno di preoccuparsi di inserire/aggiornamento del lastupdate
da soli. Puoi semplicemente fare un INSERT INTO mytable (somevalue) VALUES (?)
o UPDATE mytable SET somevalue = ? WHERE id = ?
e il DB farà la magia.
dopo aver verificato che l'ora del server DB e il tempo di applicazione Java sono gli stessi, si può solo sparare un thread in background (utilizzando Timer
con TimerTask
, o ScheduledExecutorService
con Runnable
o Callable
), che fa più o meno questo:
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;
Aggiornamento: come da aggiornamento della domanda risulta che non si ha alcun controllo sul DB. Bene, allora non hai molte opzioni buone/efficienti. Aggiorna l'intero elenco nella memoria Java con tutti i dati dal DB senza verificare/confrontare le modifiche (probabilmente il modo più veloce) o generare dinamicamente una query SQL basata sui dati correnti che esclude i dati correnti dai risultati.
L'aggiornamento è copypasted dal dupe: http://stackoverflow.com/questions/2363697/database-polling-using-java-closed – BalusC
Oracle Data Change Capture, forse? –
Solo se si lavora con un DB Oracle: [http://stackoverflow.com/questions/21177723/how-to-call-java-class-from-oracle-trigger](http://stackoverflow.com/ domande/21177723/how-to-call-java-class-from-oracle-trigger) –