2011-09-13 4 views
5

배치를 통해 많은 양의 데이터를 처리하는 매우 큰 XML 파일 (700mb +)을 작성하고 있습니다. 이 프로그램은 초대형 sybase 데이터베이스와 응용 프로그램 간의 인터페이스 역할을합니다. 현재 xsd 스키마가 클래스에 바인딩되어 있습니다. 다시 시작 논리를 염두에두고 XML을 작성할 수있는 방법이 필요합니다.Java JAXB - 재시작 논리를 사용하여 XML 파일 작성

I.E. 내가 그만 둔 곳을 알 수있다. 다시 말해, 프로그램이 실패하면 마지막으로 XML 파일에 무엇을 기록했는지 확인할 수 있어야합니다. 그러면 XML 파일에서 마지막으로 수행 한 작업을 확인할 수 있습니다. 여기에 예제가 있습니다.

<root> 
    <WorkSet> 
    <Work> 
     <Customer> 
    <Work> 
     <Customer> 
    <WorkSet> 
    <Work> 
     ..... 
<root> 

쓰기 '작업'또는 '작업 세트'노드를 작성한 후 프로그램이 실패한다고 가정 해보십시오. 처리를 중단 한 곳에서 데리러 갈 수 있습니까? XML 파일의 전단 크기로 인해 XML 파일을 메모리에 다시 읽지 않으려 고 노력하고 있습니다 (500MB의 XML을 끝내고 실패한다고 가정).

도움 주셔서 감사합니다.

답변

3

데이터를 독립 WorkSet 요소로 분할 할 수있는 경우 JAXB의 조각 모드 (JAXB가 헤더를 쓰지 않을 때)를 사용하여 한 번에 하나씩 작성할 수 있습니다. 나중에 파일을 간단히 연결하고 누락 된 XML 선언을 추가하여 닫는 태그를 닫습니다.

생성 된 클래스를 수정해야 할 수도 있습니다. 나는 @XmlRootElement을 WorkSet 자바 클래스에 추가하는 것을 의미한다. 하나의 WorkSet이 여전히 한 단계에 큰 경우 Work에서도이 작업을 수행 할 수 있지만 누락 된 태그를 생성해야합니다.

+0

+1 - 나는이 라인을 따라 뭔가를 제안하려고했습니다. –

+0

@XmlRootElement 태그를 WorkSet Java 클래스에 추가하면 여러 WorkSet를 연결 한 후 하나의 큰 XML 파일의 기능에 영향을 줍니까? 나는 JAXB에 다소 새로운 것이므로, 올바르게 이해하지 못한다면 알려 주시기 바랍니다. – TyC

+1

'@XmlRootElement'를 추가하면 이전 기능에 영향을 미치지 않는다고 생각합니다. '@XmlRootElement'을 추가하지 않으면 Marshaller.marshal()가 다음 예외를 throw합니다. com.sun.istack.SAXException2 : @ org.package.MyWorkSet "형식을 마샬링 할 수 없기 때문에 요소로 @ XmlRootElement 주석 '입니다. – palacsint

2
내가 JAXB이 작업에 적합한 도구라고 생각하지 않습니다

,하지만 ...

당신은 정렬 화 된 어떤 객체를 추적 사용자 정의 Marshaller의 구현을 작성하고 쓰는하기 위해 조각 모드를 사용할 수

개별 개체.

+0

+1 JAXB는 올바른 도구처럼 들리지 않습니다. SAX 파서 만 사용하면 파일에있는 위치를 직접 추적 할 수 있습니다. 예를 들어 StAX를보십시오 ... http://stax.codehaus.org/Home – Brad