저는 수백 개의 사업 단위에서 야간 보고서를 받아야하는 서버를 개발 중입니다. 보고서는 현재 암호화 된 CSV 파일입니다. 총 보고서 수는 나중에 사용하기 위해 데이터베이스에 저장되는 매일 500 000 - 1 000 000 레코드에 이릅니다.동시 배치 처리에서 JDBC 명령문 캐시를 생략하는 방법은 무엇입니까?
각 전송마다 PreparedStatements 세트를 생성했습니다. 이 명령.은 실행 W 확약 전에 50 개의 레코드를 일괄 처리하는 데 사용됩니다. 각 레코드로 인해 최대 20 개의 데이터베이스 삽입이 발생할 수 있습니다. 전송이 대기열에 있고 하나씩 처리되면 모두 잘됩니다.
나는이 작업을 동시에 시도 했으므로 다른 스레드가 PreparedStatements의 인스턴스와 똑같은 인스턴스를 가지고 있음을 발견했습니다. 이
- 다중 스레드가 스레드의 데이터베이스는 그것의 충족하지 않은 때 불렀다 그래서
- 커밋 할 시간이었다 결정했을 때
- 일괄 처리가 실행되는 것과 같은 배치에 문을 추가 한 다음 문제의 원인 스레드의 일부와 같은 제약이 질문은 문
의 일부를 사용하는 시간이 없었했다 : 준비된 문을 강제하는 방법 대신 명령문 캐시에서 기존 재사용의 이인가를 만들 수있다?
하지
- 하여 데이터베이스에서
- 떨어 제약을 풀링 문/연결되지 않은 일괄 처리에 대한 별도의 데이터 소스를 만드는 것보다 상황을 처리 할 수있는 더 좋은 방법이 있다면;
가 보자 스레드 T1과 T2 할 문제를 명확히하기 위해 시도 : 순서는
편집 순차적 처리를 강제로 더 이상
S1을 사용할 때마다 B1에 추가됩니다. S2를 사용할 때마다 B2에 추가됩니다. 커밋 할 때 S1은 외래 키 제약 조건 당 S2보다 먼저 커밋되어야합니다.
- T1이 T2는 전송을 처리 멋지게
- 전송들을 처리 할 때
문제가 발생 순수
- T1 배치 B1 함유 S1A에 S1A 추가 명령문 S1을 사용
- T1 배치 B2에 S2A 추가 명령문 S2를 사용 s2a 포함
- T1이 커밋 할 시간이라고 결정했습니다.
- T1 커밋 B1 배치 닝 S1A
- T2는
- T2는 S2A 함유 배치 B2에 S2B 추가 S2를 사용 S2B
- T1이 '아니오'라고
- 데이터베이스 S2B 일괄 B1의 containting의 S2A 커밋 배치 B1 함유 S1B로 S1B 추가 S1을 사용 외부 키에서 금지 된 s1b 전에 s2b가 확약됩니다.
이것은 수동 동기화와 회답을 통해 피할 수 있지만 각 스레드의 로컬 논리를 적용하는 대신 각 배치의 크기를 따로 따로 추적해야합니다.
필요한 작업을 수행하려면 공급 업체별 방법을 사용해야합니다. 어떤 RDBMS를 사용하고 있습니까? – Juris
아우. 그건 내가 듣고 싶었던 것이 아니다. 현재 테스트 시스템은 Apache Derby에서 실행됩니다. 프로덕션 데이터베이스는 Oracle 10g 또는 R이 될 것입니다. –
두 가지 대답 모두 내 문제를 생각하는 데 도움이 될 것입니다. 테스트 할 때 내가 선택한 솔루션을 제공 할 것입니다. –