2011-09-13 14 views
5

Sto creando un file XML molto grande (700 MB +) che elabora grandi quantità di dati tramite batch. Il programma funge da interfaccia tra un database di sybase estremamente grande e un'applicazione. Al momento ho lo schema xsd associato alle classi. Ho bisogno di un modo per essere in grado di scrivere l'XML con la logica del riavvio in mente.JAXB Java - Scrittura di file XML con logica di riavvio

I.E. essere in grado di sapere dove ho lasciato. In altre parole, se il programma fallisce, devo essere in grado di vedere ciò che è stato scritto l'ultima volta nel file XML in modo che possa riprendere da dove avevo interrotto. Ecco un exmaple.

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

Dire che il programma fallisce dopo aver scritto un nodo "work" o "workset" di scrittura. C'è un modo per riprendere da dove ho smesso di elaborare? Sto cercando di evitare di leggere il file XML in memoria a causa delle dimensioni di taglio del file XML (supponiamo che finisca 500mb di XML e fallisca).

Grazie per l'aiuto.

risposta

3

Se è possibile suddividere i dati in elementi WorkSet indipendenti, è possibile scriverli uno alla volta con la modalità frammento di JAXB (quando JAXB non scrive le intestazioni). Successivamente semplicemente concatenare i file e aggiungere la dichiarazione XML mancante, aprendo i tag di chiusura finali.

È possibile che sia necessario modificare le classi generate per questo. Voglio dire aggiungere @XmlRootElement alla classe java WorkSet. Se un Workset è ancora grande per un passaggio, puoi farlo anche con Lavoro, ma devi generare in qualche modo i tag mancanti.

+0

+1 - Stavo per suggerire qualcosa in questo senso. –

+0

L'aggiunta del tag @XmlRootElement alla classe java WorkSet influisce sulla funzionalità del file XML di grandi dimensioni dopo la concatenazione di più Workset? Sono un po 'nuovo il JAXB quindi fammi sapere se non lo capisco correttamente. – TyC

+1

Non penso che l'aggiunta di '@ XmlRootElement' influenzerà la tua precedente funzionalità. Senza aggiungere '@ XmlRootElement' il' Marshaller.marshal() 'lancia la seguente eccezione:' com.sun.istack.SAXException2: impossibile marcare il tipo "org.package.MyWorkSet" come elemento perché manca un @ Annotazione XmlRootElement'. – palacsint

2

Non credo JAXB è lo strumento appropriato per questo lavoro, ma ...

Si potrebbe scrivere un'implementazione personalizzata Marshaller che tiene traccia di quali oggetti sono stati schierato e utilizzare la modalità di frammento di scrivere oggetti individuali.

+0

+1 JAXB non suona come lo strumento giusto qui. Perché non usare solo un parser SAX e puoi rintracciare la tua posizione nel file. Date un'occhiata a StAX per esempio ... http://stax.codehaus.org/Home – Brad