Wenn die zeitbasierte JPA-Aktualisierungskomponente (Java Persistence API) starten, werden die ObjectGrid-Maps mit den letzten Änderungen aus der Datenbank aktualisiert.
Wenn Sie die timeBasedDBUpdate-Konfiguration für die BackingMap erstellen, wird die zeitbasierte Datenbankaktualisierungskomponente automatisch gestartet, wenn ein verteiltes primäres ObjectGrid-Shard aktiviert wird. Für ein ObjectGrid mit mehreren Partitionen wird die zeitbasierte Datenbankaktualisierungskomponente nur in Partition 0 gestartet.
Wenn Sie die timeBasedDBUpdate-Konfiguration für die BackingMap erstellen, wird die zeitbasierte Datenbankaktualisierungskomponente automatisch gestartet, wenn die lokale Map aktiviert wird.
public synchronized void startDBUpdate(ObjectGrid objectGrid, String mapName,
String punitName, Class entityClass, String timestampField, DBUpdateMode mode) {
Wenn Sie die zeitbasierte Datenbankaktualisierungkomponente stoppen möchten, können Sie dazu die folgende Methode aufrufen:
public synchronized void stopDBUpdate(ObjectGrid objectGrid, String mapName)
Die Parameter "ObjectGrid" und "mapName" müssen dieselben sein, die auch in der Methode "startDBUpdate" übergeben werden.
Im Rahmen des Features für optimistisches Sperren stellt DB2 9.5 ein Zeitmarkenfeature für geänderte Zeilen (row change timestamp) zur Verfügung. Sie können eine Spalte ROWCHGTS im ROW-CHANGE-TIMESTAMP-Format wie folgt erstellen:
ROWCHGTS TIMESTAMP NOT NULL
GENERATED ALWAYS
FOR EACH ROW ON UPDATE AS
ROW CHANGE TIMESTAMP
Anschließend können Sie das Entitätsfeld, das dieser Spalte entspricht, durch Annotation oder Konfiguration als Zeitmarkenfeld angeben. Es folgt ein Beispiel:
@Entity(name = "USER_DB2")
@Table(name = "USER1")
public class User_DB2 implements Serializable {
private static final long serialVersionUID = 1L;
public User_DB2() {
}
public User_DB2(int id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
@Id
@Column(name = "ID")
public int id;
@Column(name = "FIRSTNAME")
public String firstName;
@Column(name = "LASTNAME")
public String lastName;
@com.ibm.websphere.objectgrid.jpa.dbupdate.annotation.Timestamp
@Column(name = "ROWCHGTS", updatable = false, insertable = false)
public Timestamp rowChgTs;
}
In Oracle gibt es eine Pseudospalte ora_rowscn für die Systemänderungsnummer des Datensatzes. Sie können diese Spalte für denselben Zweck verwenden. Es folgt ein Beispiel für eine Entität, die das Feld "ora_rowscn" als Zeitmarkenfeld für die zeitbasierte Datenbankaktualisierung verwendet:
@Entity(name = "USER_ORA")
@Table(name = "USER1")
public class User_ORA implements Serializable {
private static final long serialVersionUID = 1L;
public User_ORA() {
}
public User_ORA(int id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
@Id
@Column(name = "ID")
public int id;
@Column(name = "FIRSTNAME")
public String firstName;
@Column(name = "LASTNAME")
public String lastName;
@com.ibm.websphere.objectgrid.jpa.dbupdate.annotation.Timestamp
@Column(name = "ora_rowscn", updatable = false, insertable = false)
public long rowChgTs;
}
Für andere Typen von Datenbanken können Sie eine Tabellenspalte erstellen, in der die Änderungen verfolgt werden. Die Spaltenwerte müssen von der Anwendung, die die Tabelle aktualisiert, manuell geändert werden.
Nehmen Sie eine Apache-Derby-Datenbank als Beispiel: Sie können eine Spalte "ROWCHGTS" erstellen, um die Änderungsnummern zu verfolgen. Für diese Tabelle wird auch die aktuelle Änderungsnummer verfolgt. Jedesmal, wenn ein Datensatz eingefügt oder aktualisiert wird, wird die letzte Änderungsnummer für die Tabelle um eins erhöht, und der Wert der Spalte ROWCHGTS für den Datensatz wird mit dieser erhöhten Nummer aktualisiert:
@Entity(name = "USER_DER")
@Table(name = "USER1")
public class User_DER implements Serializable {
private static final long serialVersionUID = 1L;
public User_DER() {
}
public User_DER(int id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
@Id
@Column(name = "ID")
public int id;
@Column(name = "FIRSTNAME")
public String firstName;
@Column(name = "LASTNAME")
public String lastName;
@com.ibm.websphere.objectgrid.jpa.dbupdate.annotation.Timestamp
@Column(name = "ROWCHGTS", updatable = true, insertable = true)
public long rowChgTs;
}