I m having hard time to decide between the following two implementations. I want to cache the javax.xml.parsers.DocumentBuilder object, per thread. My main concern is runtime performance - Hench I would be happy to avoid as much GC as possible. Memory is not an issue.
我写了两个POC执行书,并乐于听取社区项目/CONS关于每个项目的发言。
感谢这些帮助。
Option #1 - WeakHashMap
import java.io.IOException;
import java.io.StringReader;
import java.util.WeakHashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class DocumentBuilder_WeakHashMap {
private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
private static final WeakHashMap<Thread, DocumentBuilder> CACHE = new WeakHashMap<Thread, DocumentBuilder>();
public static Document documentFromXMLString(String xml) throws SAXException, IOException, ParserConfigurationException {
DocumentBuilder builder = CACHE.get(Thread.currentThread());
if(builder == null) {
builder = factory.newDocumentBuilder();
CACHE.put(Thread.currentThread(), builder);
}
return builder.parse(new InputSource(new StringReader(xml)));
}
}
Option #2 - ThreadLocal
import java.io.IOException;
import java.io.StringReader;
import java.lang.ref.WeakReference;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class DocumentBuilder_ThreadLocal {
private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
private static final ThreadLocal<WeakReference<DocumentBuilder>> CACHE =
new ThreadLocal<WeakReference<DocumentBuilder>>() {
@Override
protected WeakReference<DocumentBuilder> initialValue() {
try {
return new WeakReference<DocumentBuilder>(factory.newDocumentBuilder());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
public static Document documentFromXMLString(String xml) throws ParserConfigurationException, SAXException, IOException {
WeakReference<DocumentBuilder> builderWeakReference = CACHE.get();
DocumentBuilder builder = builderWeakReference.get();
if(builder == null) {
builder = factory.newDocumentBuilder();
CACHE.set(new WeakReference<DocumentBuilder>(builder));
}
return builder.parse(new InputSource(new StringReader(xml)));
}
}
两者都是一样的(将FromXMLString(FromXMLString)文件传给外部世界),以便你们能够使用?
Thank you, Maxim.