우리는 현장의 다양한 클라이언트에 연결된 스프링 부트 응용 프로그램을 가지고 있습니다. 이 응용 프로그램에는 클라이언트에서 호출되어 DB 및 실제 스위치를 사용하여 조명을 끄거나 켜는 컨트롤러가 있습니다.스프링 부트 - 컨트롤러에 대한 동시 액세스를 피하는 방법
두 개 이상의 클라이언트가 서버의 API에 액세스 할 때 문제가 발생합니다.이 방법은 상태를 변경하기 위해 표시등이 켜져 있거나 꺼져 있는지 (DB에서) 확인하기 때문에 문제가됩니다. 표시등이 꺼져 있고 동시에 2 개의 클라이언트가 동시에 서비스를 호출하면 첫 번째는 표시등을 켜고 db의 상태를 변경하지만 두 번째는 표시등에도 액세스하지만 DB의 상태는 OFF이지만 첫 번째 클라이언트는 이미 조명을 조정 했으므로 결국 초가 켜지면서 꺼질 것입니다. 아마도 내 설명이 약간 명확하지 않을 수 있습니다. 문제는 다음과 같습니다. 컨트롤러에 한 번 액세스하여 요청할 수 있습니까? 아래의 대답
덕분에, 우리는 스위치를 전환하는 방법에 대한 비관적 잠금을 도입,하지만 우리는
우리는 봄 부트를 사용하여 + 최대 절전 모드 있습니다 ... 우리의 클라이언트에서 200 개 상태가 계속
이제 컨트롤러 비관적 잠금 예외를 갖는다
@Override
@Transactional(isolation=Isolation.REPEATABLE_READ)
public void toggleSwitchNew(GpioPinDigitalOutput relePin, Interruttore interruttore, boolean on) {
Date date = new Date();
interruttore.setDateTime(new Timestamp(date.getTime()));
interruttore.setStato(on);
String log = getLogStatus(on) + interruttore.getNomeInterruttore();
logger.debug(log);
relePin.high();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
logger.error("Errore sleep ", e);
}
relePin.low();
updateInterruttore(interruttore);
illuminazioneService.createIlluminazione(interruttore, on);
}
0 다음
try {
String pinName = interruttore.getPinName();
// logger.debug("Sono nel nuovo ciclo di
// gestione interruttore");
if (!interruttore.isStato()) { // solo se
// l'interruttore
// è
// spento
GpioPinDigitalOutput relePin = interruttore.getGpio()
.provisionDigitalOutputPin(RaspiPin.getPinByName(pinName));
interruttoreService.toggleSwitchNew(relePin, interruttore, lit); // accendo
interruttore.getGpio().unprovisionPin(relePin);
}
} catch (GpioPinExistsException ge) {
logger.error("Gpio già esistente");
} catch (PessimisticLockingFailureException pe){
logger.error("Pessimistic Lock conflict", pe);
return new ResponseEntity<Sensoristica>(sensoristica, HttpStatus.CONFLICT);
}
toggleSwitchNew
은
그런 다음 우리는 우리의 고객의 요청 상태 코드를 기록하고 그들은 항상 곁에들이 동시
덕분에,이 설명은, 내가 비관적 DB 잠금, 당신이 사용하는 데이터베이스의 어떤 종류의 – besmart
에 최선의 전략이라고 분명히 생각했다? 어떻게 동시성을 테스트하고 있습니까? Hibernate로 동시성 시나리오를 테스트하는 것은 커밋시 변경 사항의 동시성이 평가되기 때문에 그렇게 간단하지 않습니다. 따라서 두 개 이상의 트랜잭션을 동시에 시작해야하며, 하나는 커밋하고 다른 트랜잭션은 실패해야합니다. @Transactional 어노테이션을 사용하면 그 단계는 스프링 프록시에서 일어납니다. – besmart
최대 절전 모드 사용하고 그런데이 경우 –