Lorsque vous démarrez le programme de mise à jour JPA (Java Persistence API) en fonction de la date/heure, les mappes ObjectGrid sont mises à jour avec les dernières modifications de la base de données.
Si vous créez la configuration timeBasedDBUpdate pour la mappe de sauvegarde, le programme de mise à jour de base de données en fonction de la date/heure est automatiquement démarré lorsqu'un fragment primaire ObjectGrid réparti est activé. Pour un ObjectGrid possédant plusieurs partitions, le programme de mise à jour de base de données en fonction de la date/heure ne démarre qu'à la partition 0.
Si vous créez la configuration timeBasedDBUpdate pour la mappe de sauvegarde, le programme de mise à jour de base de données en fonction de la date/heure est automatiquement démarré lorsque la mappe locale est activée.
public synchronized void startDBUpdate(ObjectGrid objectGrid, String mapName,
String punitName, Class entityClass, String timestampField, DBUpdateMode mode) {
Si vous souhaitez arrêter le programme de mise à jour de base de données en fonction de la date/heure, vous pouvez appeler la méthode suivante :
public synchronized void stopDBUpdate(ObjectGrid objectGrid, String mapName)
Les paramètres ObjectGrid et mapName doivent correspondre à ceux transmis dans la méthode startDBUpdate.
Comme composant de la fonction de verrouillage optimiste, DB2 9.5 offre une fonction d'horodatage des modifications de ligne. Vous pouvez définir une colonne ROWCHGTS à l'aide du format ROW CHANGE TIMESTAMP, comme suit :
ROWCHGTS TIMESTAMP NOT NULL
GENERATED ALWAYS
FOR EACH ROW ON UPDATE AS
ROW CHANGE TIMESTAMP
Par annotation ou par configuration, vous pouvez ensuite indiquer comme zone d'horodatage la zone d'entité qui correspond à cette colonne. Exemple :
@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;
}
Dans Oracle, il existe une pseudo-colonne ora_rowscn pour le numéro de modification système de l'enregistrement. Vous pouvez utiliser cette colonne aux mêmes fins. Exemple de l'entité qui utilise la zone ora_rowscn comme zone d'horodatage de la mise à jour de la base de données en fonction de la date/heure :
@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;
}
Pour les autres types de base de données, vous pouvez créer une colonne afin de rechercher les modifications. Les valeurs de cette colonne doivent être gérées manuellement par l'application qui met à jour la table.
Prenez par exemple, une base de données Apache Derby : Vous pouvez créer une colonne "ROWCHGTS" pour rechercher les numéros de modification. En outre, le dernier numéro de modification est recherché pour cette table. Chaque fois qu'un enregistrement est inséré ou mis à jour, le dernier numéro de modification de la table est incrémenté et la valeur de la colonne ROWCHGTS de l'enregistrement est mise à jour avec ce numéro incrémenté.
@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;
}