0

我正在进行合同优先集成,我首先设计 XSD 和 WSDL 文件以提供给客户以调用托管在我们服务器上的特定 Web 服务。我还需要以结构化的方式将请求保存在 DB 表中(首先是 Oracle DB,其他的稍后会出现)。我需要将所有字段保存为单独的列,并且多个出现节点可能应该有自己的表等。

我正在考虑从 XSD 创建 WS 存根并将它们标记为 JPA 的实体,然后使用这些实体创建数据库表。我正在学习 JPA (EclipseLink),我想知道这是否是最好的方法。

所以基本上我的问题是:当您从请求/响应 XSD 开始时,您将如何创建 Web 服务、JPA 实体和 DB 表?

感谢所有的想法。

问候, Gökhan

4

2 回答 2

1

使用 Web 服务生成的类作为 JPA 实体似乎是个好主意,但实际上维护起来将是一场噩梦。

最好将 JPA 层和 WebService 层分开。

JPA 层将由优化数据库设计驱动(例如关系、出于性能原因的规范化/非规范化、适当字段类型的使用、主键创建策略等)

另一方面,Web Service 层是你的应用程序(或应用程序的一部分)的外部接口,它要么给你,要么以这种方式设计,所以从 API 使用的角度来看,它是最舒服的从 JPA 的角度来看,它可能远非最佳。

想想如果有人告诉您 WSDL 即将更改,一些字段将从一个类移到另一个类,会发生什么情况。如果 Web 服务生成的类是您的实体,您还必须更改数据库模式、迁移数据等。

反之亦然。如果您需要更改您的数据库架构(例如出于性能原因),您将需要更改您的应用程序 Web 服务接口,我怀疑 Web 服务用户会对此感到高兴。

因此,即使这意味着更多的工作,也要将 JPA 层和 Web 服务层分开,这样您就可以在不更改另一部分的情况下更改其中的一部分。

在模型视图控制器模式中,JPA 层是模型的一部分,Web 服务只是您的视图——它们不应过多地相互依赖。

于 2013-05-06T19:25:15.267 回答
1

我在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 调用,而不是嵌入到应用程序中(这将涉及占用他们的依赖项) . 它是特定于供应商的,但目前我还没有找到更好的选择。

于 2015-08-27T03:40:24.687 回答