A interface ObjectMap é utilizada para interação transacional entre
aplicativos e BackingMaps.
Propósito
Uma instância do ObjectMap é obtida do objeto
de Sessão que corresponde ao encadeamento atual. A interface ObjectMap
é o principal veículo utilizado pelos aplicativos para fazer alterações em entradas
em um BackingMap.
Obtenha uma Instância do ObjectMap
Um aplicativo obtém uma
instância do ObjectMap a partir de um objeto Session utilizando método
Session.getMap(String).
O trecho de código a seguir demonstra como obter uma instância de
ObjectMap:
ObjectGrid objectGrid = ...;
BackingMap backingMap = objectGrid.defineMap("mapA");
Session sess = objectGrid.getSession();
ObjectMap objectMap = sess.getMap("mapA");
Cada instância de ObjectMap corresponde
a um objeto de Sessão específico. Chamar o método
getMap
várias vezes em um objeto Session particular com o mesmo nome de BackingMap
sempre retorna a mesma instância do ObjectMap.
Executar Commit de Transações Automaticamente
As operações
junto a BackingMaps que utilizam ObjectMaps e JavaMaps são executadas de maneira
mais eficiente em uma transação Session. O WebSphere eXtreme
Scale
fornece suporte a autocommit quando métodos nas interfaces ObjectMap e JavaMap são
chamados fora de uma transação Session. Os métodos iniciam uma transação implícita, desempenham
a operação solicitada e confirmam a transação implícita.
Semântica do Método
A seguir, está uma explicação da semântica por trás de cada
método nas interfaces ObjectMap e JavaMap.
- Método containsKey
- O método containsKey determina se uma chave possui
um valor no BackingMap ou Utilitário de Carga. Se valores nulos
forem suportados por um aplicativo, este método poderá ser utilizado para determinar se uma
referência nula retornada de uma operação get refere-se a um valor nulo ou indica
que o BackingMap e o Utilitário de Carga não contêm a chave.
- Método flush
- A semântica do método flush é semelhante ao método flush
na interface Session. A diferença notável é que a limpeza de Sessão aplica as alterações pendentes
atuais para todos os mapas que foram modificados na sessão atual. Com este método, o flush ocorre
apenas nas alterações nesta instância do ObjectMap para o utilitário de carga.
- Método get
- O método get busca a entrada a partir da instância do
BackingMap. Se a entrada não for localizada na instância do BackingMap mas um
Utilitário de Carga estiver associado com a instância do BackingMap, a instância
do BackingMap tenta buscar a entrada a partir do Utilitário de Carga. O método
getAll é fornecido para permitir o processamento de busca em lote.
- Método getForUpdate
- O método getForUpdate é o mesmo que o método
get, mas utilizar o método getForUpdate
informa ao BackingMap e ao Utilitário de Carga que a intenção é
atualizar a entrada. Um Utilitário de Carga pode utilizar esta sugestão
para emitir uma consulta SELECT for UPDATE para um backend de banco de dados.
Se uma estratégia de bloqueio pessimistic for definida para o BackingMap, o
gerenciador de bloqueios bloqueia a entrada. O método getAllForUpdate
é fornecido para permitir o processamento de busca em lote.
- Método insert
- O método insert insere uma entrada no
BackingMap e no Utilitário de Carga. Utilize este método informa ao
BackingMap e ao Utilitário de Carga que você deseja inserir uma entrada
que não existia anteriormente. Quando você chama este método em uma
entrada existente, ocorre uma exceção quando o método é chamado ou quando
a transação atual é confirmada.
- Método invalidate
- A semântica do método invalidate depende
do valor do parâmetro isGlobal que é passado
para o método. O método invalidateAll é fornecido
para permitir o processamento de invalidação em lote.
A invalidação
local é especificada quando o valor false é passado como o parâmetro
isGlobal do método invalidate. A invalidação local
descarta as alterações na entrada no cache de transação. Se o aplicativo emitir um método get, a entrada será buscada
no último valor confirmado no BackingMap.
Se nenhuma entrada estiver presente no
BackingMap, a entrada será buscada no último valor limpo ou confirmado
no Utilitário de Carga. Quando uma transação é confirmada, todas as entradas que
estão marcadas como estando invalidadas localmente não têm nenhum impacto no
BackingMap. As alterações que foram limpas no Utilitário de Carga ainda serão
confirmadas, mesmo que a entrada tenha sido invalidada.
A invalidação
global é especificada quando true é passado como o parâmetro isGlobal
do método invalidate. A invalidação global descarta as alterações
pendentes na entrada no cache de transação e ignora o valor de BackingMap nas
operações seguintes que são executadas na entrada. Quando ocorre um commit de
uma transação, as entradas que estão marcadas como invalidadas globalmente são
despejadas do BackingMap.
Considere
o seguinte caso de uso para invalidação como um exemplo: O BackingMap é suportado
por uma tabela de banco de dados que tem uma coluna de auto-incremento. As colunas de incremento
são úteis para designar números exclusivos a registros. O aplicativo insere uma
entrada. Após a inserção, o aplicativo precisa saber o número de sequência
para a linha inserida. Ele sabe que sua cópia do objeto é antiga, por isso, utiliza a
invalidação global para obter o valor do Utilitário de Carga. O código a seguir demonstra este
caso de uso:Session sess = objectGrid.getSession();
ObjectMap map = sess.getMap("mymap");
sess.begin();
map.insert("Billy", new Person("Joe", "Bloggs", "Manhattan"));
sess.flush();
map.invalidate("Billy", true);
Person p = map.get("Billy");
System.out.println("Version column is: " + p.getVersion());
map.commit();
// Close the session (optional in Version 7.1.1 and later)
for improved performance
session.close();
Esta amostra de código inclui uma entrada para Billy.
O atributo version de Person é configurado utilizando uma coluna de auto-incremento no
banco de dados. Primeiro, o aplicativo executa um comando insert.
Em seguida, ele emite um
flush, que faz a inserção ser enviada para o Utilitário de Carga e o banco de dados. O
banco de dados configura a coluna de versão para o próximo número na sequência, que
desatualiza o objeto Person na transação. Para atualizar o objeto, o aplicativo é globalmente
invalidado.
O próximo método get que é emitido obtém a entrada do Utilitário
de Carga, ignorando o valor da transação. A entrada é buscada no banco de dados
com o valor de versão atualizado.
- Método put
- A semântica do método put é independente de um método
get anterior ter sido chamado na transação para a chave. Se
o aplicativo emite uma operação get que retorna uma entrada
que existe no BackingMap ou Utilitário de Carga, a chamada do método
put é interpretada como uma atualização e retorna o valor
anterior na transação. Se uma chamada do método put
foi executada sem uma chama do método get anterior ou
uma chamada do método get anterior não localizou uma
entrada, a operação é interpretada como uma inserção. A semântica dos
métodos insert e update é aplicável
quando ocorre o commit da operação put. O método
putAll é fornecido para ativar inserção em lote e
processamento de atualizações.
- Método remove
- O método remove remove a entrada do
BackingMap e do Utilitário de Carga, se um Utilitário de Carga
estiver conectado. O valor do objeto que foi removido é retornado
por este método. Se o objeto não existir, este método retornará
um valor nulo. O método removeAll é fornecido para
ativar o processamento de exclusão em lote sem os valores de retorno.
- Método setCopyMode
- O método setCopyMode especifica um valor CopyMode
para este ObjectMap. Com este método, um aplicativo pode substituir o valor
CopyMode que é especificado no BackingMap. O valor CopyMode especificado
fica em efeito até que o método clearCopyMode seja
chamado. Os dois métodos são chamados fora dos limites transacionais.
Um valor CopyMode não pode ser alterado no meio de uma transação.
- Método touch
- O método touch atualiza o horário do último acesso
para uma entrada. Este método não recupera
o valor do BackingMap.
Utilize este método em sua própria transação. Se a chave fornecida
não existir no BackingMap devido a uma invalidação ou remoção,
ocorrerá uma exceção durante o processamento de confirmação.
- Método update
- O método update atualiza explicitamente uma entrada
no BackingMap e no Utilitário de Carga. A utilização deste
método indica ao BackingMap e ao Utilitário de Carga que você deseja atualizar uma entrada
existente. Ocorrerá uma exceção se você chamar este método em uma entrada que não existe
quando o método for chamado ou durante o processamento de confirmação.
- Método getIndex
- O método getIndex tenta obter um índice denominado
que é baseado no BackingMap. O índice não pode ser compartilhado entre
encadeamentos e funciona de acordo com as mesmas regras que um objeto
Session. O objeto index retornado deve ser convertido para a interface de índice do
aplicativo tal como a interface MapIndex, a interface
MapRangeIndex ou uma interface de índice customizada.
- Método clear
- O método clear remove todas as entradas de cache
de um mapa de todas as partições. Esta operação é uma função auto-commit,
assim, nenhuma transação ativa deverá estar presente ao chamar o método
clear.
Nota: O método clear limpa apenas o mapa no qual é chamado, deixando
quaisquer mapas de entidade relacionados não-afetados. Este método não chama
o plug-in do Utilitário de Carga.