Domanda

È lo standard Java 1.6 javax.xml.parsers.DocumentBuilder thread di classe sicuro?È sicuro chiamare il metodo parse() da più thread in parallelo?

Il JavaDoc non menziona il problema, ma il file JavaDoc per la stessa classe in Java 1.4 dice specificamente che it non lo è pensato per essere simultaneo;quindi posso supporre che nella 1.6 lo sia?

Il motivo è che ho diversi milioni di attività in esecuzione in un ExecutorService e sembra costoso chiamare DocumentBuilderFactory.newDocumentBuilder() ogni volta.

È stato utile?

Soluzione

Anche se DocumentBuilder.parse sembra non modificare il builder che esegue sull'implementazione predefinita di Sun JDK (basata su Apache Xerces).Decisione progettuale eccentrica.Cosa sai fare?Immagino di utilizzare un ThreadLocal:

private static final ThreadLocal<DocumentBuilder> builderLocal =
    new ThreadLocal<DocumentBuilder>() {
        @Override protected DocumentBuilder initialValue() {
            try {
                return
                    DocumentBuilderFactory
                        .newInstance(
                            "xx.MyDocumentBuilderFactory",
                            getClass().getClassLoader()
                        ).newDocumentBuilder();
            } catch (ParserConfigurationException exc) {
                throw new IllegalArgumentException(exc);
            }
        }
    };

(Disclaimer:Neanche un tentativo di compilare il codice.)

Altri suggerimenti

C'è un metodo reset() su DocumentBuilder che lo ripristina allo stato in cui è stato creato per la prima volta.Se stai seguendo il percorso ThreadLocal, non dimenticare di chiamare questo o sarai fregato.

Puoi anche controllare questo codice per effettuare un'ulteriore ottimizzazione https://svn.apache.org/repos/asf/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top