Java 用于'的高度可靠存储;日志';/时间序列

Java 用于'的高度可靠存储;日志';/时间序列,java,persistence,Java,Persistence,在我正在开发的应用程序中,我需要一个写后数据日志。也就是说,应用程序在内存中积累数据,并且可以在内存中保存所有数据。但是,它必须持续存在,容忍合理的故障,并允许备份 显然,我可以写SQL数据库;为了便于嵌入,Derby跃入人们的脑海。我不太喜欢处理SQLAPI(JDBC,尽管它是唇贴式的),也不需要任何查询、索引或其他修饰。记录消失了,重新启动时,我需要把它们全部读回来 还有其他合适的选择吗 尝试使用一个简单的日志文件 当数据进入时,存储在内存中并写入(附加)到文件write()后跟fsync(

在我正在开发的应用程序中,我需要一个写后数据日志。也就是说,应用程序在内存中积累数据,并且可以在内存中保存所有数据。但是,它必须持续存在,容忍合理的故障,并允许备份

显然,我可以写SQL数据库;为了便于嵌入,Derby跃入人们的脑海。我不太喜欢处理SQLAPI(JDBC,尽管它是唇贴式的),也不需要任何查询、索引或其他修饰。记录消失了,重新启动时,我需要把它们全部读回来


还有其他合适的选择吗

尝试使用一个简单的日志文件

当数据进入时,存储在内存中并写入(附加)到文件
write()
后跟
fsync()
将保证(在大多数系统上,仔细阅读系统和文件系统文档)数据被写入持久存储(光盘)。这些机制与任何数据库引擎在持久性存储中获取数据所使用的机制相同

重新启动时,重新加载日志。偶尔,修剪日志文件的前端,使数据使用量不会无限增长。或者,将日志文件建模为循环缓冲区,其大小与内存中的大小相同。

您看过(现在的Oracle)Berkeley DB for Java吗?“直接持久层”实际上使用起来非常简单。DPL的文档

具有不同的备份选项,并附带了一些实用程序。运行嵌入式


(许可证:BSD许可证的一种形式。)

什么算“合理错误”?为了制定解决方案,您确实需要定义您想要防范的情况。显然,不要在磁盘驱动器旁边爆炸。希望它正在运行的应用程序或系统崩溃——或者——与在同一台机器上运行的MySQL副本具有相同的保证级别?除非您向他们付费,否则许可证以前是GPL。现在我来看看。BDB是一个键值存储。我不想有钥匙。我希望可靠/可恢复地写入日志。DPL在这方面更糟糕,因为我不想编写java objects.ok。我在考虑一个真正简单的用法,其中日志将是一个简单的日期+字符串(或任何类型的数据)容器对象。写的时候放,装的时候拿。非常简单。你可以免费得到热备份。听起来比使用SQL简单得多。但我明白你的意思。顺便说一句,这既不是GPL也不是BSD,很抱歉。是的,这是明确的起点。如果在写入过程中拔出插头怎么办?有什么东西可以保证我在最后一个文件的末尾没有半张唱片吗?或者我只是需要编写一些代码来处理这个问题?或者,换句话说,是否有其他人用Java编写了其中一个并发布了自由/开源软件?我不确定我在这里提出的建议是否值得使用。这是一个带有write()+fsync()的for循环。许多文件系统将保证write()操作是原子的(例如,all或none)——请仔细检查您的系统。如果您真的想保持保守,请使用长度或边界字符设计日志记录,以便知道它们是完整的,并忽略任何部分尾随记录。