Pergunta

Eu tenho algum código que eu quero permitir apenas o acesso a por um fio. Eu sei como fazer isso usando ou blocos synchronized ou métodos, mas este trabalho em um ambiente de cluster?

O ambiente de destino é WebSphere 6.0, com 2 nós no cluster.

Eu tenho um sentimento que synchronized não vai funcionar, uma vez que cada instância do aplicativo em cada nó terá sua própria JVM, certo?

O que estou tentando fazer aqui é realizar algumas atualizações para registros de banco de dados quando o sistema é inicializado. Ele vai olhar para todos os registros de dados que são mais velhos que a versão do código, e executar tarefas específicas para atualizá-los. Eu só quero um nó para executar essas atualizações, desde que eu quero ter certeza de que cada item de trabalho só é atualizado uma vez, e desempenho destes melhoramentos não é uma grande preocupação, uma vez que só acontece na inicialização do aplicativo, e só realmente faz nada quando o código foi alterado desde a última vez que começou a subir.

O banco de dados é DB2v9, e eu estou acessando-lo diretamente via JNDI (sem camada ORM).

Tem sido sugerido que um bloqueio global pode ser o caminho para ir para lá, mas eu não tenho certeza de como fazer isso.

Alguém tem qualquer ponteiros nesta arena?

Obrigado!

Foi útil?

Solução

Está certo que a sincronização através de processos não irá funcionar usando as construções de sincronização Java. Felizmente, o problema realmente não é um dos sincronização de código, mas em vez de sincronizar as interações com o banco de dados.

A maneira certa de lidar com este problema é com bloqueios de nível de banco de dados. Provavelmente, você tem alguma tabela que contém uma versão do esquema db, então você deve certificar-se de trancar que a tabela para a duração do processo de inicialização / atualização.

As chamadas sql / db precisos envolvidos provavelmente seria mais claro se você especificou o tipo de banco de dados (DB2?) E método de acesso (sql cru, jpa, etc).

Update (2009/08/04 02:39) : Eu sugiro que o declaração LOCK TABLE em alguma mesa segurando a versão # do esquema. Isto irá serializar o acesso a essa tabela prevenção duas instâncias da execução através do código de atualização ao mesmo tempo.

Outras dicas

Sim, você está correto em que sincronizados blocos não vai funcionar em um cluster. A razão é, como você disse, que cada nó tem seu próprio JVM.

Existem maneiras, no entanto, para obter blocos para o trabalho sincronizado em um cluster como eles iriam trabalhar em um ambiente de nó único. A maneira mais fácil é usar um produto como Terracotta , que irá lidar com a coordenação de threads entre diferentes JVMs para que os controles de simultaneidade normais pode ser utilizado em todo o cluster. Há muitos artigos que explicam como isso funciona, como Introdução à OpenTerracotta .

Existem outras soluções, é claro. Depende principalmente sobre o que você realmente deseja alcançar aqui. Eu não usaria bloqueios de banco de dados para sincronização se você precisa de escala, como DB não. Mas eu realmente exortá-lo a encontrar uma solução pronta, porque andar com sincronização de cluster é negócio sujo:)

Você pode usar um in-memory-data-grade como http://www.hazelcast.com/ para isso também. Esta é uma estrutura de dados distribuída que suporta o bloqueio.

Uma vez que você está falando de cerca de 2 máquinas, você nem sequer têm memória compartilhada então não há nada para sincronizar.

fazer algo semelhante com o nosso banco de dados. Isto é conseguido através da adição de versões registro na tabela. Isto é o que você deve fazer,

  1. Adicione uma coluna para o registro versão / linha.
  2. Go através da lógica para verificar se as necessidades de registro para ser atualizado.
  3. Quando você atualizar o registro, certifique-se a versão de registro no DB é o mesmo que o que você tem.
  4. Bump-se a versão cada vez que você escrever para o banco de dados.

Você deve ter apenas um servidor de atualização do banco de dados se você seguir estas regras.

Você não poderia simplesmente bloquear a tabela (ou toda db) para atualizações, por isso, quando o primeiro nó obtido o bloqueio de todos os outros nós não seria capaz de escrever. nós subsequentes iria esperar, e quando o bloqueio será liberado o código seria atualizado para não atualização de registro seria necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top