Java:关系数据库与静态变量

时间:2018-03-16 11:32:22

标签: java server hashmap static-variables

我有一个网络应用程序,我在其中维护许多静态地图来存储我的相关信息。由于应用程序部署在服务器上。每次点击服务器端java都使用这些映射来匹配密钥并获得适当的结果并发送回客户端。我的代码包含排名和检索功能,因此我必须阅读每个地图的整个keySet。

我的问题是:

1。使用静态变量比将这些数据存储在Apache Derby等本地嵌入式数据库中然后使用它更好吗?

2。使用这些数据非常频繁。那么如果我使用数据库会更快的方法吗?由于我阅读了完整的密钥集,因此在许多操作中,where子句可能不会派上用场。

第3。服务器的内存如何影响静态变量中的数据?

我的不。地图是固定的,但地图的大小不断增加?请建议更好的解决方案。

2 个答案:

答案 0 :(得分:0)

如果您希望定期保存数据,那么像H2这样的嵌入式数据库是有意义的。然后,您还可以获得数据的快照,并且开发,结构更改更安全一些。

真正的数据库背后还有一个令人难以置信的力量:并发,缓存等等。嵌入式(基于文件时)数据库不那么。

地图的问题在于数据提取可能成为几个间接。在表上使用连接的SQL查询更通用。 所以SQL更抽象(不规定实际的查询实现),更容易测试。例如,SQL发布了编程报告的开发者。

所以,当你真的在努力工作时,去找一个数据库恕我直言。

答案 1 :(得分:0)

您可能需要考虑的是在搜索时将搜索到的数据存储在地图中。

例如,如果用户搜索特定的内容,那么该内容将存储在地图中,以便搜索该内容的下一个用户直接从地图而不是数据库获取数据。

但是有一些缺点,因为您需要确保如果数据库上的数据发生更改,则应使用新数据清除或更新散列映射/缓存,以防止向用户提供过期数据。 / p>

至于对服务器内存的影响,它取决于您要存储的数据的大小。很难给出一个确切的答案,但你可以自己测试一下:

long memoryBefore = Runtime.getRuntime().freeMemory();
// populate your map
long memoryAfter = Runtime.getRuntime().freeMemory();
System.out.println(memoryBefore - memoryAfter);

这应该给你使用的字节数量(或多或少,取决于你在memoryBefore和memoryAfter之间运行的操作,因为你可能已经实例化了与hashmap无关的其他类/变量)