문제

우리는 데이터베이스 테이블의 규칙 성 경합을 경험 하며이 문제를 해결하기위한 여러 가지 옵션을 평가하고자합니다.

이를 위해서는 테스트 사례에서 재생산되어 반복 가능한 신뢰성이있는 테이블 (모든 테이블)의 경합을 재현해야합니다.

내가 고려하는 접근법은 자물쇠의 의미론을 되돌리는 것입니다 (예 : java.util.concurrent.locks.ReentrantLock)) 그리고 테이블에 쓰는 것이 시작될 때 잠금 장치를 풀어 내면 글쓰기가 시작될 때 모든 읽기가 발생할 수 있습니다.

따라서 한 작가 스레드는 테이블에 삽입하기 직전까지 잠금을 고정 한 다음 잠금 장치를 공개하면 여러 리더 스레드가 동일한 테이블에 대해 선택 문을 실행하려고 시도합니다.

그러한 접근 방식에 대한 생각이 있는지 또는 100% 신뢰성으로 DB 테이블에서 경합을 재현 할 수있는 더 간단한 접근법이 있는지 궁금했습니다.

감사해요

도움이 되었습니까?

해결책

카운트 다운 레이트를 사용할 수 있습니다 1.

final CountDownLatch barrier = new CountDownLatch(1);

첫 번째 행동은 모든 독자 스레드를 시작합니다.

barrier.await();

그런 다음 작가 스레드가 할 수 있습니다

barrier.countDown();

그 시점에서 모든 독자들은 매력적으로 사라질 것입니다.

다른 팁

데이터베이스에서 경합을 생성하는 것이 얼마나 쉬운 지에 대한 데이터베이스에 크게 의존합니다. 예를 들어, Oracle을 사용하는 경우 SELECT를 수행하면 경합이 없습니다.

데이터베이스에서 경합을 생성하는 가장 쉬운 방법은 업데이트해야한다는 것을 알고있는 행에서 읽기를 선택하는 것입니다.

편집하다: 질문을 다시 읽은 후, 나는 당신이 업데이트 경합보다 데이터베이스에 대한 "독자"경합에 대해 더 관심을 갖는 것 같습니다. 위의 아이디어는 업데이트 경합을 강요하는 데 사용될 수 있지만 독자의 경합은 아닙니다.

대량의 독자를 출시하여 데이터베이스를 선택하여 데이터베이스를 홍수로 송금하려는 경우, 실제 경합이 없거나 기아 만 유발하지 않으면 다른 답변에서 언급 된대로 CountdownLatch를 사용할 수 있습니다. Object.wait/object.notifyall ()으로 1.5 Pre-1.5 JVM에서 실행 해야하는 경우.

편집 2: 댓글을 읽은 후 아마도 당신이보고있는 논쟁을 모방하는 가장 쉬운 방법은 Sybase를 사용하는 것입니다. 잠금 테이블 명령. 테이블을 잠그고 Selects를 발사 한 다음 테이블을 잠금 해제하십시오. Selects는 모든 화재를 일으켜야합니다 ... 이것은 또한 모델을 만들려고하는 상황을 가장 정확하게 모방 할 수 있다는 이점이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top