Java Persistence API (JPA) 時間ベース・アップデーターの開始時に、ObjectGrid マップがデータベース内の最新の変更で更新されます。
バックアップ・マップに対して timeBasedDBUpdate 構成を作成する場合、時間ベース・データベース・アップデーターは、分散 ObjectGrid プライマリー断片がアクティブ化された時点で自動的に開始されます。 複数区画がある ObjectGrid の場合、時間ベース・データベース・アップデーターは、区画 0 でのみ開始されます。
バックアップ・マップに対して timeBasedDBUpdate 構成を作成する場合、 時間ベース・データベース・アップデーターは、ローカル・マップがアクティブ化された時点で自動的に開始されます。
public synchronized void startDBUpdate(ObjectGrid objectGrid, String mapName,
String punitName, Class entityClass, String timestampField, DBUpdateMode mode) {
時間ベース・データベース・アップデーターを停止したい場合は、以下のメソッドを呼び出せば、アップデーターを停止することができます。
public synchronized void stopDBUpdate(ObjectGrid objectGrid, String mapName)
ObjectGrid および mapName パラメーターは、startDBUpdate メソッドに渡されたものと同じにする必要があります。
オプティミスティック・ロック機能の一部として、DB2 9.5 では、行変更タイム・スタンプ機能を提供しています。ROW CHANGE TIMESTAMP 形式を使用して列 ROWCHGTS を次のように定義できます。
ROWCHGTS TIMESTAMP NOT NULL
GENERATED ALWAYS
FOR EACH ROW ON UPDATE AS
ROW CHANGE TIMESTAMP
次に、アノテーションまたは構成によって、この列に対応するエンティティー・フィールドをタイム・スタンプ・フィールドとして指示することができます。次に例を挙げます。
@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;
}
Oracle の場合、レコードのシステム変更番号用に疑似列 ora_rowscn があります。この列を同じ目的に使用することができます。時間ベース・データベース更新のタイム・スタンプ・フィールドとしてこの ora_rowscn フィールドを使用するエンティティーの例を以下に示します。
@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;
}
その他のタイプのデータベースの場合、変更を追跡する表列を作成できます。 列の値は、表を更新するアプリケーションによって手動で管理する必要があります。
Apache Derby データベースを例として取り上げます。変更番号をトラッキングするために列 "ROWCHGTS" を作成します。 また、この表に対する最新変更番号もトラッキングされます。レコードが挿入または更新されるたびに、表の最新変更番号が増分され、レコードの ROWCHGTS 列の値がその増分された番号で更新されます。
@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;
}