有个问题向大家请教一下
目前应用中要不断的接收客户端上发的XML格式数据,
在服务端使用了DOM4J进行DTD校验
实现的过程中,每次验证XML数据都要使用SAXReader重新加载一下DTD文档(同一个DTD文档),
这样要进行大量的IO,对系统的性能会有影响,能否让所有的请求使用一个DTD文档校验,即只加载一次
如果所有的请求全用一个SAXReader,在并发时,是否会产生错误?
每次获得SAXReader的代码如下: /**
     * 指定SAX解析的的DTD校验文件
     * @param dtdPath DTD校验文件路径
     * @param dtdFile 用于校验的文件
     * @return
     */
    private static SAXReader getSaxReader(final String dtdPath, final String dtdFile) {        final String filePath = dtdPath + System.getProperty("file.separator") + dtdFile;
        SAXReader saxReader = new SAXReader();
        saxReader.setEntityResolver(new EntityResolver() {
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException,
                    IOException {
                // 指定DTD校验
                InputSource inputSource = new InputSource(filePath);
                inputSource.setEncoding(Globals.ENCODING);
                return inputSource;
            }
        });
        return saxReader;
    }
此外,对于大多数情况,XML解析中DTD验证是否开启?

解决方案 »

  1.   

    你可以把setEntityResolver 里面的这段作为你这个类的一个变量,甚至,另外单独提供一个单例的类,该类提供一个静态方法来获得这个对象。这样就可以只获取一次了。就是cache啦new EntityResolver() {
                public InputSource resolveEntity(String publicId, String systemId) throws SAXException,
                        IOException {
                    // 指定DTD校验
                    InputSource inputSource = new InputSource(filePath);
                    inputSource.setEncoding(Globals.ENCODING);
                    return inputSource;
                }
            }
      

  2.   

    多谢!这个想过,但是主要就是提出来单例之后,是否会在并发时产生影响,就是说在解析一个XML字符串的时候,另一个待解析的串到来造成对前一个的覆盖??
      

  3.   

    new InputSource(new ByteArrayInputStream(byte[] buf))
    可以多个对象同用一个 byte[]
      

  4.   


    没有覆盖saxbuilder,只是重用了EntityResolver里面的filestream