Pregunta

experimentamos con cierta contención regularidad en una tabla de la base, y nos gustaría evaluar una serie de diferentes opciones para resolver este problema.

con el fin de hacerlo, lo que necesito para reproducir en un caso de prueba, la contención en una tabla (cualquier tabla) con una fiabilidad repetible.

el enfoque que estoy teniendo en cuenta sería la de revertir la semántica de una cerradura (por ejemplo java.util.concurrent.locks.ReentrantLock) y para liberar el bloqueo al escribir sobre la mesa comienza, permitiendo que las lecturas se realicen en el momento en que comienza la escritura.

Así que, por tanto, un hilo escritor mantiene el bloqueo hasta poco antes de hacer una inserción en una tabla, y luego liberar el bloqueo, múltiples hilos lector se intente ejecutar instrucciones select en la misma tabla.

Se preguntaba si había alguna idea de este tipo de enfoque, o si hay un método más sencillo que podría, con un 100% de fiabilidad, reproducir contención en una tabla db.

gracias

¿Fue útil?

Solución

Se puede usar un CountDownLatch con un recuento de 1.

final CountDownLatch barrier = new CountDownLatch(1);

Se inicia todos los hilos lector, cuya primera acción es

barrier.await();

a continuación, el hilo escritor puede

barrier.countDown();

momento en el que todos los lectores alegremente será el fuego inmediato.

Otros consejos

Depende mucho de su base de datos como a lo fácil que es producir contención en ella. Por ejemplo, si está utilizando Oracle, a continuación, haciendo un selecto nunca se producirá ninguna contención.

La forma más fácil de producir contención en la base de datos es hacer una selección para lectura en la fila que usted sabe que está a punto de que tenga que actualizar.

Editar : Después de volver a leer la pregunta, veo que parece que se preocupan más por la contención "lector" en la base de datos de actualización de contención. La idea anterior se puede utilizar para forzar la actualización de contención, pero no lector de contención.

En el caso, en el que desea poner en marcha un número de masa de lectores para inundar la base de datos con los selecciona, lo que debería causar ninguna contención real, sólo el hambre, a continuación, puede utilizar la CountDownLatch como se ha mencionado en otra respuesta, o haces de la manera antigua con Object.wait / Object.notifyAll () si se ven obligados a correr en un pre-1.5 JVM.

Editar 2 : Después de leer el comentario, probablemente la forma más fácil de emular el argumento de que usted está viendo es utilizar el Sybase comando de tabla de bloqueo . Sólo cierra la tabla, el fuego de los selecciona, y luego desbloquear la tabla. Los selecciona debe entonces todo el fuego fuera ... Esto también tiene la ventaja de emular con mayor precisión la situación que usted está tratando de modelar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top