今天项目中做一个功能,批量修改 hibernate 配置文件,使系统可支持oracle数据库,经考虑决定使用dom4j读取 hbm.xml 文件,功能实现后发现功能运行很慢(要读写123个hbm.xml文件),后来发现原因:dom4j读取文件时都先做 dtd 验证,占据大量时间,并偶尔在运行时出现
org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect at org.dom4j.io.SAXReader.read(SAXReader.java:484) at org.dom4j.io.SAXReader.read(SAXReader.java:264)
的异常.
解决方法:
public static Document load(File file){
Document document = null;
try {
SAXReader saxReader = new SAXReader();
saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
saxReader.setEncoding("UTF-8");
document = saxReader.read(file);
} catch (Exception ex) {
ex.printStackTrace();
}
return document;
}
在读文件时把 dtd 验证去掉 ,不仅使消除异常,而且功能运行时间从十几分钟缩短至 几秒.