Java 系统在线或离线解决方案

Java 系统在线或离线解决方案,java,primefaces,distributed-transactions,distributed-system,Java,Primefaces,Distributed Transactions,Distributed System,我工作的公司有一个网络系统,一些模块将在工作中使用,它们并不总是连接到互联网。 在构建中部署系统web模块的最佳解决方案是什么? 系统无法读取/写入数据库。您可以在Web服务器上运行本地数据库。每隔15分钟检查是否存在连接,并将更改从本地数据库传输到“真实”数据库 这个问题没有完美的解决方案,原因是。如果有,分布式系统将更容易,不过:) 在我看来,你有两个选择。所有选项都需要数据客户端的副本,以便客户端在断开连接时至少可以读取数据 不允许不一致的写入,只允许不一致的读取 每当客户端离开网络时,

我工作的公司有一个网络系统,一些模块将在工作中使用,它们并不总是连接到互联网。 在构建中部署系统web模块的最佳解决方案是什么?
系统无法读取/写入数据库。

您可以在Web服务器上运行本地数据库。每隔15分钟检查是否存在连接,并将更改从本地数据库传输到“真实”数据库

这个问题没有完美的解决方案,原因是。如果有,分布式系统将更容易,不过:)

在我看来,你有两个选择。所有选项都需要数据客户端的副本,以便客户端在断开连接时至少可以读取数据

  • 不允许不一致的写入,只允许不一致的读取

    • 每当客户端离开网络时,客户端或服务器都将获得数据的写入所有权。无论哪一方拥有数据,都允许写入,而另一方必须读取数据的一个可能过时的本地副本(或者,如果这样做更好的话,它可能会生成错误,或者至少告诉用户数据过时)。如果同时运行多个客户机,这将更加困难

    • 类似的方法是,在知道没有客户机工作时运行所有服务器端写操作(即在午夜运行所有作业)。它很简单,但适用于许多应用程序

  • 允许不一致,然后稍后处理。当您必须能够同时向断开网络的两侧写入数据时,这是唯一的方法。但是,根据您的设计,有几种方法可以缓解不一致性问题:

    • 如果您可以使所有转换都是可交换的(您可以更改转换的顺序,结果将是相同的),那么您可以存储在客户端和服务器上执行的转换,然后在客户端重新连接到服务器时从客户端应用任何缓存的转换。这使得处理不一致性变得非常简单。这是ATM与银行网络断开连接时所做的操作-其交换转换类似于“从账户12345中扣除50美元”。请注意,这仍然会导致无效状态-用户可以通过访问多个与银行网络断开连接的ATM来扣除其账户中的金额。然而,银行通过在自动取款机重新连接网络时收取透支费来弥补这一点,因此他们通常不会因此损失任何金钱

    • 如果冲突很少,您可以告诉客户机用户,“嘿,您在脱机时写了这个,但是服务器上的值更改了-我应该保留哪个副本?”这有一个问题,您可能需要多次询问,由于用户必须对更改的值执行原子操作,并且可能有多个客户端同时重新连接。如果你不小心,这种方法也会受到影响(但这取决于你在做什么)


  • 我认为这是一个解决方案,但由于web应用程序可以更改数据库中的数据,以及在构造中的数据。系统同时访问同一数据库有几种结构。在这15分钟的时间间隔内,交易可能会出现不一致。类似于,如果您发现其中一项有用,请不要忘记接受答案!