자바 데이터베이스 연동 예제

새 응용 프로그램을 디자인하든 레거시와 통합하든 데이터베이스는 가장 중요한 자산인 데이터를 보유합니다. 크고 복잡한 Oracle 데이터베이스에 대한 응용 프로그램을 작성할 때 경험상 최대 절전 모드는 SQL:2008 및 Oracle의 확장에 근접하고 싶었기 때문에 적합하지 않았습니다. 데이터베이스 행 잠금은 RDBMS 공급업체가 지정된 테이블에서 동시 데이터 처리 활동의 동기화를 관리하기 위해 제공하는 훌륭한 기능 중 하나입니다. 훌륭한 기능이지만 데이터베이스 측의 오래된 잠금으로 인해 시스템이 막히는 것과 같은 중요한 시나리오로 이어질 수 있습니다. 신중하게 생각하면 여러 스레드가 처리할 행을 선택하기 위해 경쟁할 때 두 개 이상의 스레드가 동일한 행에 대해 경쟁하는 경우가 있을 수 있습니다. 그런 다음 한 스레드가 행 잠금에 대한 액세스 권한을 얻게되고 다른 스레드는 첫 번째 스레드가 처리를 완료하고 행 잠금을 해제 할 때까지 기다려야합니다. 따라서 예상 처리량을 달성하는 가장 효과적인 방법은 아닙니다. 일부 행이 이미 잠겨 있는 경우 잠금을 위해 해제될 때까지 기다리지 않고 해당 행을 건너뛰도록 지정하는 방법이 필요합니다. 그렇다면 어떻게 구현할 수 있을까요? 다행히 오라클은 행 잠금을 요청할 때 이미 잠긴 행을 무시하는 멋진 기능을 제공했습니다. 쿼리에 대해 “LOCKED 건너뛰기” 부분을 추가하기만 하면 됩니다.

일부 다른 데이터베이스 공급업체도 이 기능을 제공하지만 전부는 아닙니다. 예를 들어 MSSQL에는 이 기능이 있지만 MySQL에는 이 기능이 붙내장된 기능으로 존재하지 않습니다. jOOQ는 SQL을 처음에 있는 것과 같은 언어로 취급합니다. jOOQ는 독특하고 현대적인 유창한 API 디자인 기술을 통해 SQL을 Java에서 직접 내부 도메인 별 언어로 포함하므로 개발자가 실제 SQL과 거의 같은 코드를 쉽게 작성하고 읽을 수 있습니다. MSG_STATUS는 메시지 수명 주기의 상태를 나타내는 열거형을 의미합니다. 이 예제에서는 상태 값 1을 사용하여 메시지 데이터를 처리하고 처리된 후에는 해당 값을 2로 설정하여 처리된 행으로 표시해야 한다고 가정해 보겠습니다. VENDOR_ID 값은 isValidToProcess() 메서드에서 필터링 논리를 수행하는 데 사용됩니다. 그래서 우리의 실행 흐름은 다음과 같이 될 것입니다, 그게 다야, 지금 당신은 거의 완료.

이제 동시성 문제없이 여러 스레드를 사용하여 위의 코드를 실행할 수 있습니다. 그러나, 여기에 또 하나의 문제가 있다 – 오 일반적인, 또 다른 하나 🙁 내가 그것이 무엇인지 설명 할 수 있습니다. 만일 우리의 isValidToProcess() 메서드가 false를 반환하면 결과는 어떻게 됩니까? 간단합니다, 우리는 잠금을 해제하고 반환하는 resultSet.updateRow() 메서드를 호출합니다. 모든 좋은, 그렇지? 안타깝게도 이 동작은 Oracle 클라이언트 jar, Oracle 데이터베이스 버전 및 사용 중인 연결 캐싱 매개 변수에 따라 달라질 수 있습니다. 값 충돌 예외와 관련된 마지막 두 가지 개선 사항으로 이 코드 블록을 실행하고 isValidToProcess() 메서드에서 false를 반환하는 데이터가 있는 경우 잠시 후 Oracle 측에서 오래된 잠금이 표시됩니다. 나는 우리의 프로젝트 중 하나에서 이것을 경험했다, 날 믿어, 그것은 문제를 해결하기 위해 가장 중요하고 어려운 문제 중 하나입니다. 기본적으로 테이블의 일부 행은 로그의 예외 없이 추가 업데이트에 액세스할 수 없습니다. 흥미로운 점은 Spring JDBC 및 오라클의 API 문서에 따라 구현을 올바르게 수행했다는 것입니다. 그래서 그것은 힘든 일이 되지 않을까요? 잘, 먼저, 어떻게이 문제를 해결 하려고? 그리고 이것에 대한 수정 은 무엇입니까? 문제 해결을 위해 당시에는 의심스러운 것이 없기 때문에 행 잠금 코드로 인해 이 문제가 발생해야한다고 생각했습니다. 내가 sysdba로 다음 쿼리를 실행 한 것을 확인하려면 (당신은 오라클 사용자로 “sqlplus / sysdba로”명령을 실행하여 sysdba로 로그인 할 수 있습니다) 먼저, sqlplus에서 더 읽기 쉬운 출력을 얻기 위해이 명령을 실행합니다. jOOQ는 SQL 변환을 수행하여 일반적인 SQL 식을 데이터베이스의 가장 가까운 일치 항목으로 변환합니다.