Introdução ao ObjectMap

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.