提高性能:在内存中存储更多,在数据库中存储更少?

时间:2014-03-26 15:35:18

标签: java sql database performance

我正在一个要求高性能的项目......我被告知尽可能使用少量数据库调用,并在JVM内存中使用更多对象。右。

所以......起初并没有让我感到震惊,但现在我对这种方法提出质疑。

我怎么知道哪个最好?

一方面我会:

 - static Map <id1, id2>
 - static Map <id2, ObjectX>

Object X
 - id2
 - map <id1, ObjectY>

Object Y
 - id1

基本上,这个数据结构可以帮助我从id1获取一个ObjectY。而且我还可以在需要时发回整个ObjectX。

您必须知道该结构由服务调用(A)填充。然后,对象ObjectY的更新可以通过另一个服务(B)发生。最后,另一个服务可以发送回ObjectX(C)。这使得三种服务使用数据。

另一方面,我可以:

 - db table for ObjectY T1
 - db join table associating id1s and id2s T2
 - db table for Object X T3

服务A将在表格中插入。 服务B将在表T1中进行更新 服务C将在T2和T1之间建立连接以获取ObjectX的所有ObjectY对象

在我看来,db版本更灵活......我不确定性能,但我会说db版本不应该比&#34;内存慢#34;版。最后,没有&#34;记忆&#34;版本有风险?

我希望你们中的一些人看起来很明显我应该选择一个版本以及为什么......我希望这不是一场辩论。我正在寻找方法来更快地了解...

2 个答案:

答案 0 :(得分:2)

您正在做的是构建缓存。它是一种非常受欢迎且经过验证的技术,有许多实现,从简单的Map使用到完整的供应商产品,支持跨服务器的缓存,以及各种各样的铃声和口哨。

而且,做得好,你确实应该得到各种各样的性能提升。但缓存中的主要挑战是:您如何知道缓存条目何时“陈旧”,即数据库内容已更改,但您的缓存不知道它?

这里你可能有一个明显的答案。你可能正在缓存实际上不会改变的东西。缓存失效是这里适当的术语 - 什么时候刷新它,因为你知道它是陈旧的,你需要新的内容。

我认为你正确认识到的所有权衡都是你个人需要权衡的,你更有信心不会“错过某些东西”。

最后一个想法 - 你有足够的内存来缓存一切吗?也许你需要限制它,例如获得请求的前100,000个对象。查看第三方缓存工具(如EHCache或Guava)可能很有用:

https://code.google.com/p/guava-libraries/wiki/CachesExplained

答案 1 :(得分:2)

检索存储在内存中的对象将采用hundreds of nanoseconds的顺序(如果最近已访问它,那么会更少,因此它在缓存中)。当然,这种延迟会因您的平台而异,但这是一个比较的大概数字。从数据库中检索相同的信息 - 再次取决于许多因素,例如数据库是否在同一台机器上 - 但它至少需要毫秒级,即数万倍的速度。

哪个更快 - 您需要更具体,您将测量哪些操作的速度?但内存版本在几乎所有情况下都会更快。数据库版本提供了不同的优势 - 持久性,来自不同机器的访问,事务提交/回滚 - 但速度不是其中之一,而不是与内存计算相比。

是的,内存中的版本存在风险 - 基本上如果机器断电(或者进程因任何原因退出......内存损坏,未捕获的异常),那么数据将会丢失(即内存解决方案会丢失)与数据库不同,没有“持久性”。