Pergunta

Experimentamos com alguma contenção de regularidade em uma tabela de banco de dados e gostaríamos de avaliar várias opções diferentes para resolver esse problema.

Para fazer isso, preciso reproduzir em um caso de teste, contenção em uma tabela (qualquer tabela) com confiabilidade repetível.

A abordagem que estou considerando seria reverter a semântica de uma trava (por exemplo java.util.concurrent.locks.ReentrantLock) e para liberar a trava ao escrever sobre a mesa começa, permitindo que todas as leituras ocorram no momento em que a escrita começa.

Portanto, um thread de um escritor segura o bloqueio até que, pouco antes de fazer uma inserção em uma tabela e, em seguida, liberando o bloqueio, vários threads do leitor tentariam executar instruções selecionadas contra a mesma tabela.

Ficou se perguntando se havia algum pensamento sobre essa abordagem, ou se existe uma abordagem mais simples que poderia, com 100% de confiabilidade, reproduzir a contenção em uma tabela de banco de dados.

obrigado

Foi útil?

Solução

Você poderia usar um contagem de touchs com uma contagem de 1.

final CountDownLatch barrier = new CountDownLatch(1);

Você inicia todos os tópicos do leitor, cuja primeira ação é

barrier.await();

Então o tópico do escritor pode

barrier.countDown();

Nesse ponto, todos os leitores disparam alegremente.

Outras dicas

Depende muito do seu banco de dados sobre como é fácil produzir contenção nele. Por exemplo, se você estiver usando o Oracle, fazer uma seleção nunca produzirá nenhuma contenção.

A maneira mais fácil de produzir contenção no banco de dados é fazer uma seleção para ler na linha que você sabe que precisa atualizar.

Editar: Depois de reler a pergunta, vejo que você parece se importar mais com a contenção do "leitor" no banco de dados do que a contenção de atualização. A idéia acima pode ser usada para forçar a contenção da atualização, mas não a contenção do leitor.

No caso, onde você deseja lançar um número em massa de leitores para inundar o banco de dados com seleções, o que não deve causar nenhuma afirmação real, apenas fome, então você pode usar o contagem regressivo, como mencionado em outra resposta, ou fazê -lo do jeito antiquado da moda com object.wait/object.NotifyAll () se você for forçado a executar em uma JVM pré-1.5.

Editar 2: Depois de ler o comentário, provavelmente a maneira mais fácil de imitar a afirmação que você está vendo é usar a sybase Comando da tabela de bloqueio. Basta bloquear a mesa, disparar as seleções e desbloquear a tabela. As seleções devem então disparar ... Isso também tem a vantagem de imitar com mais precisão a situação que você está tentando modelar.

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