reproduzindo de maneira confiável a contenção de banco de dados
-
20-09-2019 - |
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
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.