Ao iniciar um atualizador baseado em tempo do Java Persistence API (JPA), os mapas do ObjectGrid são atualizados com as últimas alterações no banco de dados.
Se você criar uma configuração do timeBasedDBUpdate para o mapa de apoio, o atualizador do banco de dados baseado em tempo será iniciado automaticamente quando um shard primário do ObjectGrid distribuído for ativado. Para um ObjectGrid com várias partições, o atualizador do banco de dados baseado em tempo será iniciado apenas na partição 0.
Se você criar uma configuração do timeBasedDBUpdate para o mapa de apoio, o atualizador do banco de dados baseado em tempo será iniciado automaticamente quando o mapa local for ativado.
public synchronized void startDBUpdate(ObjectGrid objectGrid, String mapName,
String punitName, Class entityClass, String timestampField, DBUpdateMode mode) {
Se você desejar parar o atualizador de banco de dados baseado em tempo, poderá chamar o seguinte método para parar o atualizador:
public synchronized void stopDBUpdate(ObjectGrid objectGrid, String mapName)
Os parâmetros ObjectGrid e mapName devem ser os mesmos que aqueles transmitidos no método startDBUpdate.
Como parte do recurso de bloqueio otimista, o DB2 9.5 fornece um recurso de registro de data e hora de alteração de linha. É possível definir uma coluna ROWCHGTS utilizando o formato ROW CHANGE TIMESTAMP, conforme a seguir:
ROWCHGTS TIMESTAMP NOT NULL
GENERATED ALWAYS
FOR EACH ROW ON UPDATE AS
ROW CHANGE TIMESTAMP
Em seguida, é possível indicar o campo de entidade que corresponde à esta coluna como o campo do registro de data e hora pela anotação ou configuração. Este é um exemplo:
@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;
}
No Oracle, há uma semicoluna ora_rowscn para o número de alteração do sistema do registro. É possível utilizar esta coluna para o mesmo propósito. Um exemplo da entidade que usa o campo ora_rowscn como o campo do registro de data e hora de atualização de banco de dados baseado em tempo é o seguinte:
@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;
}
Para outros tipos de bancos de dados, é possível criar uma coluna da tabela para controlar as alterações. Os valores da coluna precisam ser gerenciados manualmente pelo aplicativo que atualiza a tabela.
Tome o banco de dados Apache Derby como exemplo: É possível criar uma coluna "ROWCHGTS" para controlar os números de alteração. Além disso, um número de alteração mais recente é controlado para esta tabela. Sempre que um registro for inserido ou atualizado, o número de alteração mais recente para a tabela é aumentado e o valor da coluna ROWCHGTS para o registro é atualizado com o número aumentado.
@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;
}