保证并发Web服务调用之间数据一致性的最佳方法?

时间:2009-02-04 18:13:15

标签: java sql database multithreading java-ee

多个客户端同时访问在Glassfish或其他应用程序服务器上运行的JAX-JWS Web服务。持久性由Hibernate或OpenJPA之类的东西提供。数据库是Microsoft SQL Server 2005。

服务需要一些输入参数,发生一些“魔术”,然后返回基本上是序列中下一个可用值的转换版本,特定序列和转换由输入确定。执行转换的“魔法”取决于输入参数和各种数据库表(描述输入参数之间的关系,转换,获取下一个基值的序列,以及特定序列的已服务值列表)。不确定这是否可以全部包含在存储过程中(可能),但也不确定客户是否需要它。

确保一致性的最佳方法是什么(即每个值都是唯一的,值是按顺序消耗的,没有机会让值到达客户端而不存储在数据库中),同时保持性能?

2 个答案:

答案 0 :(得分:2)

如果没有完整的描述(表格模式等),很难提供完整的答案,但在这里我最好的猜测它是如何工作的,我会说你需要围绕你的“魔法”进行交易,这标志着返回之前序列中的下一个值。如果你想重复使用序列号,那么你可以稍后取消它们(例如,如果用户取消他们正在做的事情),或者你可以认为它们丢失了。

一个警告是您希望您的交易尽可能短而快,特别是如果这是一个高吞吐量系统。否则你的序列表很快就会成为瓶颈。分析过程并查看最短的事务窗口是什么,它仍然允许您确保序列不被重用并使用它。

答案 1 :(得分:0)

听起来你拥有这里需要的大部分元素。根据您实现服务的方式,可能会造成困难的一件事是您不希望在安全地提交数据库事务而没有错误之前向浏览器写任何响应。

许多Web框架使持久性会话保持打开(并且未提交),直到呈现响应以支持视图延迟加载持久对象为止。如果在您的情况下这是真的,您需要确保在确定它已提交之前,没有任何渲染视图传递给客户端。

一种方法是Servlet Filter,它缓存您正在使用的servlet或Web服务框架的输出,直到它完成其工作。