我在DoxDB上采用了稍微不同的方法,因为我选择了 JSON 而不是 XML 作为文档结构,尽管我认为它与您的需要相差不远(事实上,当我开始使用它时,我首先使用的是 XML)。
TL;DR 版本
使用 LOB 存储您的 XML 内容。您的 JPA 只有一个@Lob
注释,您可以将内容加载到其中。
使用 XSD 验证来自传输的数据,使用Marshaller
通过 @WebService 调用的数据,该服务提供 CRUDL 方法将条目作为 JPA 实体中的 lob 处理。
然后调整安全性和性能。
更多细节
需要注意的是我没有将 Json/XML 本身映射到数据库字段和表中,而是我有一个带有“模式名”列、一个 LOB 和一些 ID 的表(尽管目前它有一些额外的字段用于审计和只执行逻辑删除)。我搜索了 Stack Overflow,似乎一致认为如果数据相似,最好有一个大表而不是许多小表,此外 JPA 不支持动态表名。
我没有选择 JAX-WS,而是选择了 JAX-RS(REST API),但这只是一个传输层,您可以根据需要选择其中一个。在该层中,我实现了一个与 JPA 交互的 CRUDL API。您也可以在 JAX-RS 中传递 XML,如果您不想这样做,则不需要使用 WSDL。
初始性能指标还不错。加载 100,000 行大约需要一分钟,而单行检索仍在亚秒内完成。检索和呈现 100,000 行大约需要 5 秒。当然,它没有科学依据,我怀疑它在现实生活中是否会有这种性能,由于 XA 事务、分布式友好、安全性和很少的传递依赖,负载很大。
我早期做出的一个架构决定是DoxDB不打算在数据库上进行搜索,而是将该作业传递给 ElasticSearch,后者通过他们的 REST API 调用,而不是嵌入到应用程序中(这将涉及占用他们的依赖项) . 它是特定于供应商的,但目前我还没有找到更好的选择。