사례 1의 경우, 서블릿은 데이터베이스에 액세스하는 일부 코드를 사용합니다. 데이터베이스에는 사용자가 사용해야하는 잠금 메커니즘이 있습니다. 이것에 대한 두 가지 중요한 이유가 있습니다. 데이터베이스 자체는 데이터를 읽고 쓰는 다른 응용 프로그램에서 사용될 수 있습니다. 앱이 자체적으로 경쟁하는 것만으로는 충분하지 않습니다. 그리고 : 자신의 응용 프로그램은 코드의 여러 복사본이 별도의 컴퓨터에서 실행되는 확장되고 클러스터 된 웹 컨테이너에 배포 될 수 있습니다.
따라서 데이터베이스의 잠금을 처리하는 데 많은 표준 패턴이 있으므로 비관적 및 낙관적 잠금을 읽어야 할 수 있습니다. 당신은 개념, 자바 동기화가 변수 방법 범위에 제공 사용하지 않고 서블릿 코드를 작성할 수 있도록
서블릿 API와 JBC 연결 풀링은 그래서 유일한
Start transaction (perhaps implicit, perhaps on entry to an ejb)
Get connection to DB (Gets you a connection from pool, associated with your tran)
read/write/update code
Close connection (actually keeps it for your thread until your transaction commits)
Commit (again maybe implictly)
가 당신에게 도움이 보증을 제공합니다 진짜 문제는 DB의 모든 논쟁을 다루는 것입니다. 위의 모든 것들은 요즘 JPA와 같은 것들을 사용하여 좀 더 정중하게 수행되는 경향이 있지만, 어떤 일이 벌어지고 있는지에 대해서는 거의 다루지 않습니다.
사례 2 : 정적 방법입니다. 이것은 아마도 모든 것을 메모리 구조로 유지한다는 것을 의미 할 것입니다. (일종의 원격 호출을 금지하는) 단일 JVM을 고수하고 자신 만의 잠금을 관리합니다. 귀하의 JVM이나 기계가 추락하면 데이터를 잃어버린 것 같아요. 데이터에 관심이 있다면 DB를 사용하는 것이 좋습니다.
또는 완전히 다른 접근 방법은 어떨까요? 서블릿은 영구 JMS 대기열에 메시지를 작성하여 "투표"를 기록합니다. 다른 프로세스가 대기열에서 투표를 선택하여 추가합니다. 이런 식으로 유권자에게 즉각적인 피드백을주지는 않겠지 만, 사용자의 경험을 실제 시나리오 (유사한 시나리오에서)와 매우 복잡한 처리로 분리합니다.
감사합니다. 마이크. 예, 저는 JDBC를 사용합니다. ThreadLocal에 대해서도 읽어 볼 것입니다. 다시 한번 감사드립니다. – Abdullah
서블릿 API 및 기타 JEE API는이 작업을 간소화합니다. 서블릿 메소드의 지역 변수는 효과적으로 스레드 로컬 (서비스 요청 지속 기간 동안)입니다. 응용 프로그램 서버의 JDBC 연결 풀링은 각 스레드에게 자체 연결을 제공합니다. 대부분의 어려움은 서로 다른 스레드가 경쟁하는 경우 발생합니다.이 경우에는 데이터베이스 자체에서 발생합니다. Affe가 말했듯이 이것이 실제 디자인 작업이 시작되는 곳입니다. – djna