在java中保存和检索数据的快速而安全的方法

时间:2015-10-08 11:37:16

标签: java

为了将数据持久性添加到面向计费软件,我想知道在我的情况下保存和检索数据的最佳方法是什么。

我使用JavaFX的TableView填充自定义对象(包含许多字符串,整数,布尔值......),每个表示一个账单。用户必须能够即时添加,读取和编辑数据。一切都存储在本地,不需要使用云等。

我通常使用序列化来编写我的对象,但它是一种安全快捷的方式来存储大约10.000个自定义对象吗?

我应该使用XML,序列化,本地数据库(使用JavaDB?)还是......?

快速,我的意思是用户可以编写和编辑数据。启动应用程序时,加载时间很短,没问题。 通过安全,我不是指加密,它是安全的“数据不会丢失或损坏”的方式。

最终,如果有多个解决方案,为什么一个在另一个?

3 个答案:

答案 0 :(得分:1)

如果被滥用/误解,任何持久性机制(平面文件,关系数据库,nosql)如果按设计使用或不安全都可以是安全的。你的问题是一个非常开放的问题,可以得到很多参与,或者非常轻松......这一切都取决于。

通常选择归结为:

  • 平面文件(比如二进制序列化,csv,json或xml)。非常简单的机制,需要努力扩展到大文件,并在更改代码库时必须小心;因为更改可能会阻止旧文件的可读性。在根据用户的更改和机器崩溃的可能性编写数据时,人们也必须记住这一点。即没有交易,因此数据可能会损坏,而不是一个简单的主题。至于哪种格式是最好的,很多宗教战争已经开始,但通常文本格式(json,xml或csv)具有人类可读的优点,有助于调试/维护任务。 XML和Json支持嵌套结构,这比CSV更有优势。至于性能,与二进制文件相比,文本操作通常会使解析器减慢约10倍。然而,有快速实现和慢速实现,对于10k对象,您不太可能注意到差异。
  • 关系数据库。对于受益于使用关系查询(SQL)的应用程序非常有用,并且已经付出了很多努力使它们对于机器崩溃具有事务性和健壮性。它们通常是大型企业选择的持久性机制,需要一些知识来设置和维护数据库本身。 H2是一个非常简单,低成本的入门提供商,Oracle处于另一个极端的领域。关系数据库受到域不匹配的影响,特别是对象设计和SQL设计在没有开发人员的一些努力的情况下不会映射到一起。它们通常也会遇到缩放问题,因为它们通常不可群集,而不是10k行的问题。
  • 没有sql数据库(例如redis,cassandra,mongo,couch,neo4j)。通常不是事务性的,但它们通常比关系式dbs更快,并且从一开始就提供集群,使它们非常健壮。它们还支持不同的数据建模范例,如图形,列表,文档,使NoSQL格局比关系SQL格式更丰富。

我认为你没有从事专业项目并缺乏导师,所以我会先建议你先关注平面文件,然后选择某种类型的DB产品进行试验(H2非常好用于学习关系产品,以及Mongo或Redis,以便于学习NoSql产品之一)。

答案 1 :(得分:0)

您可以使用H2数据库(http://www.h2database.com/),这是存储数据的非常方便的方法,您可以使用嵌入式数据库,这看起来像

Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");
// add application code here
conn.close();

H2在名为test.db的用户主目录中创建文件测试。

答案 2 :(得分:0)

对象序列化是安全的。它并不是特别快,您必须非常小心如何对类进行更改以确保您可以始终反序列化。这是我对对象序列化的最大缺点。

XML(或JSON)也不错。有一些绑定技术,如JAXB,Jackson或Gson,它们允许您将对象无缝映射到XML或JSON。允许绑定使这些格式比对象序列化更容易使用,具有人类可读和可编辑的额外好处,但具有更冗长的成本(考虑文件压缩)。如果您的存储格式是一个巨大的XML文件,您还可以使用XPath搜索记录。

JavaDB(或H2或SQLite)的优点在于它实现了关系数据存储,因此您可以对数据执行SQL查询。使用适当的数据库管理大量记录要简单得多。你也可以节省磁盘空间。我会推荐这种方法。

是否有多个客户阅读这些文件?在这种情况下,为了安全起见,您必须实现某种文件锁定方案以防止数据损坏。您可以通过某种进程外数据管理来解决这个问题,使用轻量级服务器(如H2)或其中一个NoSQL数据存储区(如Mongo或Cassandra)。