我需要从可以采用任何格式的传入消息中提取数据。要存储的提取数据也取决于格式,即格式A可以提取字段X,Y,Z,但格式B可以提取字段A,B,C。我还需要通过搜索字段C来查看消息B.消息。
现在我正在配置和存储提取策略(XSLT)并在遇到相关格式时在运行时执行它,但我将提取的数据作为XmlType
列存储在Oracle数据库中。 Oracle似乎对XmlType
的开发/支持非常宽松,因为它需要一个旧的jar,它迫使你使用一个非常古老的DOM DocumentBuilderFactory
impl(看起来像Java 1.4代码),它与Spring 3相撞,而且与Hibernate的搭配并不是很好。 XML查询也很慢且不直观。
我得出的结论是,使用XmlType
的Oracle并不是存储提取数据的好方法,所以我的问题是,存储序列化/可查询数据的最佳方法是什么?
答案 0 :(得分:2)
您未列出的一个替代方案是使用XML Database。 (请注意,Oracle是十种左右的XML数据库产品之一。)
(显然,blob类型不允许查询持久化XML对象的“内部”,除非您将每个blob实例读入内存并在那里进行查询;例如使用XSLT。)
答案 1 :(得分:1)
我在PostgreSQL中存储复杂的xml对象方面取得了很大的成功。与功能索引功能一起,您甚至可以在存储的xml文件的节点值上创建索引,并使用这些索引使用索引扫描执行非常快速的查找,而无需重新分析XML文件。
但是,只有当您知道查询模式时,这才会起作用,任意xpath查询也会很慢。
示例(未经测试,肯定包含语法错误):
创建一个简单的表格:
create table test123 (
int serial primary key,
myxml text
)
现在让我们假设您有xml文档,如:
<test>
<name>Peter</name>
<info>Peter is a <i>very</i> good cook</info>
</test>
现在创建一个函数索引:
create index idx_test123_name on table123 using xpath(xml,"/test/name");
现在你加快xml查找:
SELECT xml FROM test123 WHERE xpath(xml,"/test/name") = 'Peter';
您还应该考虑使用text_pattern_ops创建索引,这样您就可以进行快速前缀查找,如:
SELECT xml FROM test123 WHERE xpath(xml,"/test/name") like 'Pe%';