数据库命中率是否比访问java中的集合更昂贵?

时间:2012-12-20 13:35:29

标签: java database performance collections

刚刚实现了一个设计,我已经在hashmap中缓存了一些数据并从中检索了数据,而不是从DB查询相同的数据。

我的想法是否正确?

7 个答案:

答案 0 :(得分:7)

将数据副本保存在内存中几乎肯定比从数据库中获取数据更快。

尽管如此,还需要考虑进一步的考虑因素:

  1. 当您持有内存中的副本时,数据库中的数据是否会发生变化?如果是这样,你将如何处理?
  2. 内存消耗会成为一个问题吗?
  3. 你确定你正在优化一个真实的,而不是想象的瓶颈吗?

答案 1 :(得分:4)

点击集合比点击数据集快几个数量级,特别是在另一台服务器上(由于通信滞后)

那说:

  • 数据库可以自己缓存数据,因此可能不需要进行此优化
  • 如果数据非常大,则必须处理内存消耗
  • 必须处理数据更新,例如通过使缓存无效

答案 2 :(得分:3)

如果你仔细考虑与数据库交谈时会发生什么,你可以自己回答:

  1. 您的程序必须将查询发送到数据库。根据数据库服务器是在进程中运行还是在网络上的其他位置运行,这可能需要几微秒到几毫秒。
  2. 数据库服务器必须解析您的查询并生成执行计划。根据服务器的不同,它可能会为经常执行的查询缓存执行计划。如果没有,请计划另外几微秒来生成计划。
  3. 数据库服务器必须执行您的计划,读取访问数据所需的任何磁盘块。每次磁盘访问都需要几十毫秒。根据表的大小以及索引的编制程度,您的查询可能需要几秒钟。
  4. 数据库服务器必须打包数据并将其发送回应用程序。同样,根据它是在进程中还是在整个网络中,这将需要几微秒到几毫秒,并且它将根据发送回的数据而变化。
  5. 您的应用程序必须将检索到的数据转换为有用的表单。这可能是一微秒或更短。
  6. 相比之下,对散列数据结构的查找需要一些内存访问,每个访问可能需要几纳秒。差异是several orders of magnitude

答案 3 :(得分:2)

要考虑的主要问题是缓存的大小:在某个阈值之后,您造成的伤害大于良好。例如,如果缓存有一百万个条目,并且每个条目都是1 KB(考虑到每个对象的开销,不是很难达到),那么您已经占用了一个完整的千兆字节的堆。在这种情况下,主要GC的表现也会很糟糕。

答案 4 :(得分:0)

总是比你在代码级别所做的任何事情都要昂贵。

答案 5 :(得分:0)

这样看:要查询数据库,必须将字节复制到内存。因此,访问内存总是比访问数据库更快。

答案 6 :(得分:0)

如果计算哈希码的成本很低,它应该快得多,它还取决于条目的数量(因为会有更多的冲突)