2008-09-04 5 views
14

우리는 점차 새로운 Java 기반 시스템으로 대체 할 기존 C++ 응용 프로그램을 보유하고 있습니다. Java에서 모든 것을 완벽하게 재 구현할 때까지는 C++과 Java가 서로 통신해야한다고 생각합니다 (RMI, SOAP, 메시징 등 - 우리는 결정하지 않았습니다).C++과 Java 간의 Oracle 트랜잭션 전파

내 관리자는 Java 및 C++ 측에서 동일한 Oracle DB 트랜잭션에 참여해야한다고 생각합니다. 이것은 하나의 프로세스가 DB 및 메시지 대기열과 같은 2 개의 트랜잭션 자원을 조정하는 일반적인 분산 트랜잭션 문제와 관련이 있습니다.

프로세스간에 트랜잭션을 전파하는 것은 성능 및 안정성 관점에서 끔찍한 아이디어라고 생각하지만 솔루션을 요청할 것입니다.

저는 XA 트랜잭션에 익숙하며 일부는 JBoss Transaction Manager로 작업했지만 Google 검색은 두 프로세스간에 XA 트랜잭션을 전파 할 때 좋은 점이 없습니다.

우리는 Java 측에서 Spring을 사용하고 있으며 문서에 명시 적으로 트랜잭션 전파에 도움이되지 않는다고 명시되어 있습니다.

전통적인 Java EE 서버 (예 : IBM Websphere)는 전파를 지원할 수 있습니다 (최종 문서는 찾을 수 없음).

해결책에 대한 도움이나 조언을 보내 주시면 대단히 감사하겠습니다.

+0

당신은 "삽입"당신이 응용 프로그램은 JVM은 저장 프로 시저를 수? 그런 다음 C++에서 데이터베이스 연결을 통해 응용 프로그램 조각을 "간단하게"호출 할 수 있습니다. – ibre5041

+0

은 이론적으로 당신은 또한 oposit 할 수 있습니다. c-stored 프로 시저와 마주 치면 다시 데이터베이스에 "연결"됩니다. 그런 다음이 절차는 동일한 거래에 참여하게됩니다. – ibre5041

+0

또한 분산 트랜잭션의 "이름 지정"을 할 수 있습니다. 즉 요리 된 이름을 지정합니다. 다른 프로세스가 동일한 트랜잭션에 "결합"할 수 있습니다. 이 목적으로 AFAIK DBMS_XA 또는 DBMS_TRANSACTION을 사용할 수 있습니다. – ibre5041

답변

10

Oracle 내에서 DBMS_XA 패키지를 사용하여 동일한 트랜잭션에서 여러 세션이 작동하도록 허용하는 an example on Laurent Schneider's blog이 있습니다. 따라서 어떤 종류의 추가 코디네이터 없이도 Java 및 C++ 세션을 동일한 트랜잭션에 참여시킬 수 있습니다.

또는 Workspace Manager 사용을 고려할 수 있습니다. 이는 원래 장기 실행 트랜잭션 (즉 제안 된 개발을위한 많은 공간 데이터 조작)을 지원하도록 설계되었습니다. 기본적으로 작업 공간을 만들 수 있습니다. 작업 공간은 명명 된 트랜잭션과 대략 동일합니다. Java 및 C++ 코드는 모두 별도의 세션에서 해당 작업 영역에 들어갈 수 있으며 둘 다 해당 작업 영역에서 데이터를 조작하고 커밋 할 수 있습니다. 트랜잭션이 완료되면 작업 영역을 LIVE 작업 영역에 병합 할 수 있습니다. 이는 정상적인 트랜잭션에서 커밋을 수행하는 것과 같습니다.

반면에 프로세스 간의 트랜잭션 조정이 성능, 안정성, 단순성 및 유지 관리 관점에서 나쁜 아이디어라고 할 수 있다는 초기 평가에 동의합니다. 반면에 C++ 코드가 어떻게 폐기 될지에 따라 합법적 인 비즈니스 요구 사항이 될 수 있습니다 (즉 트랜잭션이 독점적으로 Java 또는 독점적으로 C++ 일 수있는 방식으로 코드를 대체 할 수 있는지 여부)

0

JBoss Transaction Manager는 웹 서비스 호출에서 2pc tx 전파를 지원합니다. 그렇게하면 시스템을 통합 할 수는 있지만 성능이 악화 될 수 있습니다.

4

이러한 문제를 해결하기 위해 메시징 및 분산 메모리 잠금을 사용했지만 이러한 도구를 사용하면 동일한 데이터를 터치하는 부분에서 소프트웨어를 다시 수정해야합니다. C++ 클라이언트 문서 here 자바 클라이언트 here

오라클은 또한 당신을 도와 dev에 가이드에 locking를 볼 수 있습니다 오라클 코 히어 런스라는 유사한 제품이있다.

또한 데이터베이스가 어떤 상황에서 당신을 도울 수 Oracle Streams Advanced queueing (트랜잭션 지속 큐)라는 MQ 시스템이 포함되어 있습니다. Oracle AQ는 Oracle 트리거와 잘 통합됩니다.

또한 캐시를 업데이트하거나 업데이트 프로세스를 알리는 데 도움이되는 Database Change Notification이 있으며 Optimistic Offline Lock pattern과 함께 사용할 수 있습니다.

아파치 사육사는 분산 locking 당신을 도울 수 Software transactional memory

참조하십시오.

+0

감사를 제공 할 수 있습니다. 현상금은이 질문에 대한 유일한 새로운 대답이기 때문에 당신에게 현상금을 수여 할 것입니다. 그러나, 나는 또 다른 대안, 가능성이 비싼 타사 제품 (나 오라클 엔터프라이즈 에디션)가 필요하지 않습니다 특히 경량 솔루션을 찾고 있어요. – MRalwasser

+0

나는 이것을하는 쉬운 방법이 없다고 생각한다. 옵션 http://programmers.stackexchange.com/a/122100 "레거시 코드 작업"을 살펴이 한 것처럼 시스템이 무엇을하는지에 따라하고하는 모습 – oluies