Java 系统在线或离线解决方案
我工作的公司有一个网络系统,一些模块将在工作中使用,它们并不总是连接到互联网。 在构建中部署系统web模块的最佳解决方案是什么?Java 系统在线或离线解决方案,java,primefaces,distributed-transactions,distributed-system,Java,Primefaces,Distributed Transactions,Distributed System,我工作的公司有一个网络系统,一些模块将在工作中使用,它们并不总是连接到互联网。 在构建中部署系统web模块的最佳解决方案是什么? 系统无法读取/写入数据库。您可以在Web服务器上运行本地数据库。每隔15分钟检查是否存在连接,并将更改从本地数据库传输到“真实”数据库 这个问题没有完美的解决方案,原因是。如果有,分布式系统将更容易,不过:) 在我看来,你有两个选择。所有选项都需要数据客户端的副本,以便客户端在断开连接时至少可以读取数据 不允许不一致的写入,只允许不一致的读取 每当客户端离开网络时,
系统无法读取/写入数据库。您可以在Web服务器上运行本地数据库。每隔15分钟检查是否存在连接,并将更改从本地数据库传输到“真实”数据库 这个问题没有完美的解决方案,原因是。如果有,分布式系统将更容易,不过:) 在我看来,你有两个选择。所有选项都需要数据客户端的副本,以便客户端在断开连接时至少可以读取数据
- 每当客户端离开网络时,客户端或服务器都将获得数据的写入所有权。无论哪一方拥有数据,都允许写入,而另一方必须读取数据的一个可能过时的本地副本(或者,如果这样做更好的话,它可能会生成错误,或者至少告诉用户数据过时)。如果同时运行多个客户机,这将更加困难
- 类似的方法是,在知道没有客户机工作时运行所有服务器端写操作(即在午夜运行所有作业)。它很简单,但适用于许多应用程序
- 如果您可以使所有转换都是可交换的(您可以更改转换的顺序,结果将是相同的),那么您可以存储在客户端和服务器上执行的转换,然后在客户端重新连接到服务器时从客户端应用任何缓存的转换。这使得处理不一致性变得非常简单。这是ATM与银行网络断开连接时所做的操作-其交换转换类似于“从账户12345中扣除50美元”。请注意,这仍然会导致无效状态-用户可以通过访问多个与银行网络断开连接的ATM来扣除其账户中的金额。然而,银行通过在自动取款机重新连接网络时收取透支费来弥补这一点,因此他们通常不会因此损失任何金钱
- 如果冲突很少,您可以告诉客户机用户,“嘿,您在脱机时写了这个,但是服务器上的值更改了-我应该保留哪个副本?”这有一个问题,您可能需要多次询问,由于用户必须对更改的值执行原子操作,并且可能有多个客户端同时重新连接。如果你不小心,这种方法也会受到影响(但这取决于你在做什么)
我认为这是一个解决方案,但由于web应用程序可以更改数据库中的数据,以及在构造中的数据。系统同时访问同一数据库有几种结构。在这15分钟的时间间隔内,交易可能会出现不一致。类似于,如果您发现其中一项有用,请不要忘记接受答案!