【问题标题】:IMDB (In Memory Database) Vs Java CollectionsIMDB(内存数据库)与 Java 集合
【发布时间】:2012-06-15 06:23:35
【问题描述】:

我的问题是:有没有办法使用 java.util.collections(ArrayList/HashMap/3rd 方 LIB 等)实现数据库类型的功能(内存数据库提供)让我稍微描述一下.

我有具有不同 25 个属性的模型类帐户,我可以将 5000 个帐户的数据存储在 ArrayList 上。同样的方式,我可以通过创建表 t_Account 来保存内存数据库中的数据。现在我想实现下面提到的一些基本操作

  1. 根据每个属性按升序/降序排序。 (例如 SQL 的 Order By 操作)

  2. 根据每个属性的不同过滤条件过滤掉特定的模型帐户? (在 SQL 中对表应用 WHERE/AND 条件)

  3. 根据特定属性搜索特定帐户? (在 SQL 中对表应用 LIKE 操作)

总之我的主要目的是用Java实现内存数据库相关的功能,应该和内存数据库操作一样好?

提前感谢您宝贵的时间和建议...

【问题讨论】:

    标签: database performance collections in-memory-database


    【解决方案1】:

    当然你可以做数据库在内存中做的部分事情,只要你不这样做

    • 想要实现复杂的查询

    • 在大数据集上寻找性能:复杂的索引(包括它们的维​​护)不是一件容易的事

    但是 5000 条记录是一个非常小的集合,因此您可以使用自定义函数和索引在内存中轻松管理它们。可以在任何语言的小集合上轻松实现排序、过滤和搜索。

    你好像用java("ArrayList"),看Collections.sort()。只要您的比较函数很快,对小集合进行排序就很快。

    另一方面,使用像 sqlite 这样的小型数据库也很容易。如果您不确定是否可以从 java 解决方案开始,如果分析显示您无法足够有效地处理内存数据库以满足您的需要,则可以稍后集成外部工具。如果它很容易放入 RAM 并且您不必保留数据,请尝试在内存中进行。使用数据库的第一个原因是持久性。相反,如果您必须在程序的启动停止(或崩溃)之间保留记录,请使用数据库。

    【讨论】:

    • 感谢您的快速建议,我只放了 5000,例如它可能会达到 20k-25k。下面是更多细节
    • 如果它很容易放入 RAM 并且您不必保留数据,请尝试在内存中进行。使用数据库的第一个原因是持久性。
    • 感谢您的快速回复,我只放了 5000,例如它可能会达到 20k-25k。下面是更多细节 1. 要获取数据,我可能需要根据不同的标准应用过滤器,所以在这种情况下,我必须遍历整个列表。 2. 我可以使用 sort() 方法,但我可能需要为每个属性实现。 3. 有没有更好的方法来对 List 应用任何操作而不是遍历每个元素?像例如Account 类的一个属性是“类型”,所以当我想要通过作为“检查/保存”而不是遍历所有元素来传递所有帐户的子列表时,它应该给出结果
    【解决方案2】:

    HSQLDBH2 纯 Java SQL DB 都可以完全在内存中运行(尽管它们不是原生的,但它们的速度相当快)。

    连接字符串,HSQLDB:jdbc:hsqldb:mem:,H2:jdbc:h2:mem:。您可以在它们后面添加一个标识符,以创建支持同一 VM 中的多个连接的内存数据库。

    本机嵌入式 SQL DB SQLite 也可以完全在内存中运行,Xerial SQLite 驱动程序使用连接字符串 jdbc:sqlite::memory:。请注意,SQLite 不允许在 :memory: 之后使用标识符,如果您在同一 VM 中打开两个到 :memory 的连接,您将获得两个不同的内存数据库。

    我认为没有真正需要使用命名内存中的连接,因为如果您需要从不同的线程中使用相同的连接对象,您可以重用它,并且上述所有三个数据库都是线程安全的。

    Firebird 嵌入式数据库不提供内存数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 2012-12-05
      • 2011-11-06
      • 2014-02-08
      • 2021-05-30
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多