我有一个大的XSLT字符串,我用它来将XML转换为json。我在一个dropwizard webservice中这样做,其中非常需要并发。当我将此XSLT字符串存储在文件中时,它会导致所有Web服务线程按顺序从文件系统访问文件(从而延迟执行)。
如果我尝试将该XSLT存储为java字符串,则会出现constant string too long
异常。我可以存储此XSLT的最佳方式是什么,以便我的线程可以并行访问它?
答案 0 :(得分:3)
如果XSLT源真的那么大,你应该将它存储在一个文件中,例如:作为类路径资源,只加载并解析一次:
private static Templates largeTemplate;
初始化使用(仅限一次):
try (InputStream in = Test.class.getResourceAsStream("path/to/large.xslt")) {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
largeTemplate = transformerFactory.newTemplates(new StreamSource(in));
}
然后为每个帖子:
Transformer transformer = largeTemplate.newTransformer();
// Use transformer here
答案 1 :(得分:2)
您不想多次编译同一个大型XSLT文件,即使多个编译并行完成也是如此。在初始化Web服务期间或在第一次引用时编译它,并保存已编译的样式表(如果您正在使用JAXP,则为Templates对象),以便可以将其重用于多个转换。 Templates对象是线程安全的,因此使用此样式表的多个转换可以同时运行。