2010-03-25 89 views
9

TLDR:使用内存数据库vs锁和并发数据结构的优点/缺点是什么?关于内存数据库与线程安全数据结构的建议

我目前正在研究一个具有许多(可能是远程)显示的应用程序,这些显示从多个数据源收集实时数据并在屏幕上实时呈现它们。其他开发人员之一建议使用内存数据库,而不是使用其他系统的标准方式,即使用并发hashmaps,队列,数组和其他对象来存储图形对象并安全地处理它们必要时锁定。他的观点是,数据库将减少需要担心并发性,因为它会自动处理读/写锁,并且数据库将提供更简单的方法将数据构造成我们需要的许多表,而不是创建具有列表等等,并保持一切。

我自己没有太多的数据库经验,所以我问问同胞SO用户他们有什么经验,以及将数据库插入系统的优点是什么&?

+0

增加了一个赏金来征求更多的答案 – 2010-03-28 16:52:54

+0

这就是STM库的目的!他们为你管理锁定。 – 2010-07-31 23:47:23

回答

5

那么主要的con会是Java和数据库之间的不匹配。如果你不需要它,那将是一件非常头疼的事情。对于非常简单的访问,它也会慢很多。另一方面,在崩溃的情况下,好处将是文件系统的事务和持久性。另外,根据您的需要,它允许以一种常规的Java数据结构难以处理的方式进行查询。

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

更新如果你的数据结构是很简单 - 地图列表,地图的地图,类似的东西,你也许可以逃脱无论是在JDK或Google Collections并发集合,但远远超出这一点,您可能会发现自己正在重新创建内存数据库。如果你的查询限制甚至是非常困难的,你将不得不自己实现所有这些设施。然后你必须确保它们同时工作等等。如果这需要任何严重的复杂性或规模(大数据集),我绝对不会推出自己的产品,除非你真的想承诺它。

如果你确实决定使用嵌入式数据库,那么有很多选择。您可能想从考虑是否想要使用SQL或NoSQL路线开始。除非你看到SQL的真正好处,否则我认为这也会大大增加你的应用程序的复杂性。 Hibernate可能是最简单的路线,实际SQL最少,但它仍然是一个令人头疼的问题。我已经完成了Derby没有严重问题,但它仍然不直接。您可以尝试db4o这是一个可以嵌入并且不需要映射的对象数据库。 This is a good overview.就像我以前说过的那样,如果是我,如果我可能会尝试Neo4j,但那可能只是我想玩新的闪亮的东西;)我认为它是一个非常透明的图书馆,是有道理的。 Hibernate/SQL和db4o似乎有太多的感觉轻量级的挥手。

+2

关于对文件系统持久性的额外容易性的好处 – 2010-03-25 18:09:36

+1

通过使数据模型更加透明,数据库方向也取得了巨大的成功。对涉及复杂数据结构的代码进行更改可能非常复杂。然而,当数据被组织为表格和关系时,情况会更加明显。而对于现代的ORM,我不认为现在的数据库访问是最令人头痛的事情。当然,与手写复杂数据结构并发性相比,头疼得多。我会选择数据库路由。 – nicerobot 2010-03-25 18:13:19

+0

neo4j看起来非常有前途,现在我已经在他们的wiki上读了一些关于它的内容。 – 2010-03-30 17:24:13

-1

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

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

+0

你误解了我的问题。我没有说数据库不是线程安全的,事实上这是为什么要使用数据库的考虑因素之一。 – 2010-03-29 13:35:19

1

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

简言之,推理的TimesTen是公平的:“让我们的外包并发性/可扩展性问题,别人并专注于我们的业务领域”,并感觉良好即可。但是这在2006年又回来了。我不认为今天会做出这样的决定。

并发是很难的,但如此处理是内存中的数据库。解放并发性问题你必须成为内存数据库领域的专家。微调TimesTen进行复制是很困难的(我们必须聘请Oracle的专业顾问来完成这项工作)。许可证不是免费的。您还需要担心其他图层不是开源的,并且/或者可能使用与您理解的语言不同的语言编写。

但是,如果不知道自己的经验,预算和时间要求等因素,很难作出任何判断。周围购物,花点时间研究像样的并发框架(如http://akkasource.org/)......并让我们知道你已经决定的东西;)

4

您可以使用类似Space4J,并获得和内存数据库的好处既是收藏品一样的界面了。在实际使用中,像Collection 这样基本的东西是,它是一个没有索引的内存数据库。列表一个内存数据库中有一个int索引。一个映射在内存数据库中的一个索引类型基于T索引和没有并发性,除非同步或java.util.concurrency。*实现。

+2

space4j的索引模式非常强大,有4种类型的索引。看看:http://forum.space4j.org/posts/list/5.page – TraderJoeChicago 2011-09-13 02:02:42

1

以下是这可能有助于决定一些问题。

  • 查询 - 您是否需要以不同形式查询/重新投射/汇总您的数据?
  • 交易 - 您是否曾经需要回滚添加的数据?
  • 持久性 - 你只需要出示收集的数据,或者你还需要将其存储在某种方式?
  • 可扩展性 - 您的数据是否总是适合内存?
  • 性能 - 它应该多快?