Depende de si la base de datos en cuestión lo admite. También deberá tener en cuenta los gastos generales. Muchas inserciones/actualizaciones también significan muchas notificaciones y tu código Java tiene que manejarlas consistentemente, de lo contrario surgirán.
Si el modelo de datos lo permite, simplemente agregue una columna adicional que contiene una marca de tiempo que se actualiza en cada inserción/actualización. La mayoría de los DB principales admiten una actualización automática de la columna en cada inserción/actualización.No sé qué servidor de base de datos que está utilizando, así que voy a dar solamente un ejemplo-dirigida de 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)
)
De esta manera usted no tiene que preocuparse acerca de cómo insertar/actualizar el lastupdate
mismo. Puede hacer un INSERT INTO mytable (somevalue) VALUES (?)
o UPDATE mytable SET somevalue = ? WHERE id = ?
y el DB hará la magia.
Después de asegurarse que el tiempo del servidor de base de datos y el tiempo de aplicación Java son los mismos, sólo puede disparar un subproceso en segundo plano (utilizando Timer
con TimerTask
o ScheduledExecutorService
con Runnable
o Callable
), que hace más o menos esto:
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;
Actualización: según la actualización de la pregunta, resulta que no tiene control sobre la base de datos. Bueno, entonces no tienes muchas opciones buenas/eficientes. O bien actualice la lista completa en la memoria Java con todos los datos de DB sin verificar/comparar los cambios (probablemente la manera más rápida), o genere dinámicamente una consulta SQL basada en los datos actuales que excluyen los datos actuales de los resultados.
La actualización está copiada del truco: http://stackoverflow.com/questions/2363697/database-polling-using-java-closed – BalusC
Oracle's Change Data Capture, tal vez? –
Solo si está trabajando con Oracle DB: [http://stackoverflow.com/questions/21177723/how-to-call-java-class-from-oracle-trigger](http://stackoverflow.com/ preguntas/21177723/how-to-call-java-class-from-oracle-trigger) –