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

Posted

技术标签:

【中文标题】将Java应用程序数据冗余存储在文件中的最佳方法是啥?【英文标题】:What's the best way to keep java app data stored redundantly in a file?将Java应用程序数据冗余存储在文件中的最佳方法是什么? 【发布时间】:2010-04-22 21:30:00 【问题描述】:

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

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

【问题讨论】:

收到实时数据后,您可以首先将该信息存储在文件中或由文件支持的数据库中,或者是 OODB (例如 db4o)或 SQL DB(例如 HSQLDB/H2)或 Berkeley DB 等,或者使用 XStream 和 then 等“手动”进行操作,然后返回数据并显示它。这样,您将永远不会显示 “未正确存储” 的内容。这一切都取决于您的需求。我只是在评论一种方法,以确保 “用户看到的内容”“用户下次将看到的内容” 之间没有不匹配(例如,如果计算机重新启动)是存储然后从存储中显示 感谢 Wizard、Jeff 和 Stephen 的宝贵意见。你们真棒!我会对此深思熟虑。 【参考方案1】:

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

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

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

没有一种正确的方法可以做到这一点,但希望这些想法可以帮助您入门。

【讨论】:

【参考方案2】:

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

一种方法是在实时数据进入时将其提交到数据库,然后显示来自数据库的数据以保持一致性。

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

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

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

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

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

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

【讨论】:

以上是关于将Java应用程序数据冗余存储在文件中的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

对于 asp.net mvc Web 应用程序,将文本文件存储到 Sql Server 数据库中的最佳方法是啥?

像pickle一样在Java中存储数据的最佳方法

使用strings.xml 在数据库上存储多语言值的最佳方法?

Java Bean Validation 最佳实践

Java Bean Validation 最佳实践

MongoDB数据建模性能