内存数据库与线程安全数据结构的建议

时间:2010-03-25 17:51:53

标签: java database concurrency

TLDR:使用内存数据库与锁和并发数据结构的优缺点是什么?

我目前正在开发一个应用程序,它有许多(可能是远程的)显示器,可以从多个数据源收集实时数据并在屏幕上实时呈现。其他开发人员之一建议使用内存数据库而不是我们其他系统行为的标准方式,即使用并发哈希映射,队列,数组和其他对象来存储图形对象并安全地处理它们必要时锁定。他的论点是数据库将减少担心并发性的需要,因为它将自动处理读/写锁,并且DB将提供一种更简单的方法将数据结构化为我们需要的尽可能多的表,而不是创建的哈希映射列表等的哈希图并跟踪它们。

我自己没有太多数据库经验,因此我向其他SO用户询问他们有什么经验以及什么是专业人士和是否将DB插入系统?

5 个答案:

答案 0 :(得分:5)

一个主要的骗局是Java与数据库之间的不匹配。如果你不需要它,那将是一件非常令人头痛的事。对于非常简单的访问,它也会慢得多。另一方面,在崩溃的情况下,好处是文件系统的事务和持久性。此外,根据您的需要,它允许以可能难以使用常规Java数据结构的方式进行查询。

对于介于两者之间的事情,我会看一下Neo4j。它是一个纯Java图形数据库。这意味着它易于嵌入,处理并发和事务,可以很好地扩展,并且没有关系数据库所具有的所有不匹配问题。

已更新如果您的数据结构足够简单 - 列表地图,地图地图等等,您可以使用JDK中的并发集合或{{3}但是,除此之外,您可能会发现自己正在重新创建内存数据库。如果您的查询约束甚至是非常困难的,那么您将不得不自己实现所有这些设施。然后你必须确保它们同时工作等。如果这需要任何严重的复杂性或规模(大型数据集),我绝对不会自己动手,除非你真的想要承诺它。

如果您决定使用嵌入式数据库,那么有很多选择。您可能希望首先考虑是否要使用SQL或NoSQL路由。除非你看到SQL的真正好处,否则我认为这也会大大增加你应用的复杂性。 Hibernate可能是你用最少的实际SQL最简单的路径,但它仍然令人头痛。我已经用Google Collections完成了没有严重问题,但它仍然不是直截了当的。您可以尝试Derby这是一个可以嵌入的对象数据库,不需要映射。 db4o就像我之前说过的那样,如果我可能会尝试Neo4j,那就是我,但这可能就是我想要玩新的闪亮的东西;)我只是觉得它是一个非常透明的库感。 Hibernate / SQL和db4o似乎太过挥手以感觉轻量级了。

答案 1 :(得分:4)

您可以使用Space4J之类的东西,并获得接口和内存数据库等集合的好处。在实际使用中,像这样基本的东西是一个没有索引的内存数据库。列表具有单个int索引的内存数据库。 Map 在内存数据库中,具有单个索引类型T的索引,除非是synchronized或java.util.concurrency。*实现,否则不会并发。

答案 2 :(得分:1)

我曾经为一个使用Oracle TimesTen的项目工作过。这是在2006年初Java 5刚刚发布并且java.util.concurrent类几乎不为人所知的时候。我们开发的系统具有相当大的可扩展性和吞吐量要求(它是SMS / MMS消息的核心电信盒之一)。

简单地说,对TimesTen的推理是公平的:“让我们将并发/可扩展性问题外包给其他人并专注于我们的业务领域”,然后就完美了。但这是在2006年。我认为今天不会做出这样的决定。

并发很难,但处理内存数据库也是如此。解决并发问题,你必须成为内存数据库世界的专家。微调TimesTen进行复制很难(我们不得不聘请Oracle的专业顾问来完成这项工作)。许可证不是免费提供的。您还需要担心非开源的附加层和/或可能使用与您理解的语言不同的语言编写。

但是如果不了解你的经验,预算,时间要求等,就很难做出任何判断。做一些购物,花一些时间来寻找合适的并发框架(例如http://akkasource.org/)......让我们知道你已经决定了什么;)

答案 3 :(得分:1)

以下几个问题可以帮助做出决定。

  • 查询 - 您是否需要以不同的形式查询/重新投影/汇总数据?
  • 交易 - 您是否需要回滚添加的数据?
  • 持久性 - 您是否只需要提供所收集的数据,还是需要以某种方式存储它?
  • 可扩展性 - 您的数据是否始终适合内存?
  • 表现 - 应该多快?

答案 4 :(得分:-1)

我不清楚为什么你觉得内存数据库不能是线程安全的。

你为什么不看看JDO和DataNucleus?它们有许多不同的数据存储区,您可以在运行时插入后端持久性提供程序作为配置步骤。您的应用程序代码依赖于ORM,但ORM可能会插入到RDBMS,DB40,NeoDatis,LDAP等中。如果一个后端不适合您,请切换到另一个。