簡體   English   中英

確保並發Web服務調用之間的數據一致性的最佳方法?

[英]Best performing way to guarantee data consistency between concurrent web service calls?

多個客戶端正在同時訪問在Glassfish或某些其他應用程序服務器上運行的JAX-JWS Web服務。 持久性由Hibernate或OpenJPA之類的東西提供。 數據庫是Microsoft SQL Server 2005。

該服務采用一些輸入參數,發生一些“魔術”,然后返回序列中下一個可用值的基本轉換形式,具體的序列和轉換由輸入確定。 執行轉換的“魔術”取決於輸入參數和各種數據庫表(描述輸入參數,轉換,從中獲取下一個基值的序列以及特定序列已提供的值的列表之間的關系。 )。 不知道這是否可以全部包裝在存儲過程中(可能),但也不確定客戶端是否要在其中存儲它。

在保持性能的同時,確保一致性的最佳方法是什么(即每個值都是唯一的,並且按順序使用值,而沒有機會在不將其也存儲在數據庫中的情況下將其傳遞給客戶)?

如果沒有完整的描述(表模式等),很難提供完整的答案,但是在此最好地猜測它的工作方式,我想說您需要圍繞“魔術”進行事務處理,這標志着下一個價值在返回之前按使用順序進行操作。 如果要重用序列號,則可以稍后取消標記它們(例如,如果用戶隨后取消了它們在做什么),或者可以認為它們已丟失。

一個警告是您希望您的交易盡可能短且盡可能快,尤其是在這是一個高吞吐量的系統中。 否則,您的序列表可能很快成為瓶頸。 分析該過程,看看最短的事務窗口是什么,仍然可以確保不重復使用序列並使用它。

聽起來您在這里擁有所需的大多數元素。 根據您實現服務的方式,可能會造成困難的一件事是,您不希望在安全無誤地安全提交數據庫事務之前不向瀏覽器寫入任何響應。

許多Web框架都使持久性會話保持打開狀態(並且未提交),直到呈現響應以支持通過視圖延遲加載持久性對象為止。 如果您的情況是對的,則需要確保在確認提交之前,沒有任何渲染視圖交付給客戶端。

一種方法是Servlet Filter ,該Filter會緩沖正在使用的Servlet或Web服務框架的輸出,直到完成其工作為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM