将Java应用程序数据冗余存储在文件中的最佳方法是什么?

时间:2010-04-22 21:30:01

标签: java xml save

如果我的系统基于实时数据,我如何确保所有当前信息冗余存储在文件中?因此,当程序再次启动时,它会使用此信息将自身初始化回到关闭时的位置。

我知道xstream和HSQLDB。但不确定这是否是需要作为字面副本的数据的最佳选择。

2 个答案:

答案 0 :(得分:0)

这完全取决于您存储的应用数据类型。如果需要精确地重新创建java对象(即变量和状态相同),则可以序列化所需的对象。有很多序列化机制,例如你提到的xstream。如果您直接存储对象,则可以使用其中一种机制。

但是,很多时候,您希望存储应用程序的状态,这不一定直接对应于直接序列化对象。如果是这种情况,您只能写出所需的相关数据。您使用的存储类型取决于您的需求。如果您有大量数据,请考虑使用数据库。较小的数量可能在平面文件中更好。

另一件事是将数据冗余地存储在单个文件中似乎不太有用。如果文件损坏,您将丢失两个副本,因此如果需要考虑冗余,请将其存储在不同的位置(即主数据库和备份数据库)。

没有一种正确的方法可以做到这一点,但希望这些想法可以让你开始。

答案 1 :(得分:0)

创建大量内存数据的文字副本(即快照)是昂贵的。每次更新内存数据时重复该过程可能会非常昂贵。您需要重新考虑您的应用程序架构。

一种方法是将实时数据提交到数据库,然后从数据库中显示数据以保持一致性。

第二种方法是提交数据库并维护显示的并行内存数据结构。您还需要实现代码,以便在应用程序重新启动时从数据库重建内存数据结构。这是更多的代码,并且由于某些错误,用户在重新启动后会看到不同的内容,因此存在更多机会。

第三种方法是完全从内存数据结构中工作,并按如下方式处理数据持久性:

  • 定期暂停处理更新,并使用xstream,java序列化或其他任何方式拍摄整个内存数据结构的快照。

  • 每个更新都需要可靠地记录(带有时间戳)一个或多个可以重播的文件的文件。

  • 当应用程序重新启动时,您从上一个快照重新加载,然后重放自快照以来到达的所有更新。

最后一种方法存在的问题是,只有一个最新的稳定数据副本。如果由于硬盘或操作系统故障而丢失,那么你就是敬酒。在其他方法中,可以使用RDBMS对此类事物的现成支持实现的热备用数据库解决此问题。