存储由java servlet(Tomcat)检索的大数据的最佳位置

时间:2010-09-02 14:27:57

标签: java tomcat servlets jndi

我有java servlet从mysql数据库中检索数据。为了最小化到数据库的往返,它只在init()方法中检索一次,并被放置到HashMap<> (即缓存在内存中)。

现在,这个HashMap是servlet类的成员。我不仅需要存储此数据,还需要更新基础hashmap值类的缓存对象中的某些值(实际上是计数器)。并且有一个Timer(或Cron任务)来安排将这些计数器转储到DB。

因此,在谷歌搜索后,我找到了3个存储缓存数据的选项:

1)就像现在一样,作为servlet类的成员(但servlet可以停止服务并随意由容器重新投入使用。然后数据将丢失)

2)在 ServletContext (我是对的,建议在这里存储少量数据吗?)

3)在 JNDI资源

最喜欢的方式是什么?

4 个答案:

答案 0 :(得分:5)

将其放入ServletContext但请使用ConcurrentHashMap以避免并发问题。

答案 1 :(得分:3)

从这3个选项中,最好将其存储在应用程序范围内。即使用ServletContext#setAttribute()。你想使用ServletContextListener来做这件事。在普通的servlet中,您可以通过继承的ServletContext方法访问getServletContext()。在JSP中,您可以通过${attributename}访问它。

如果数据过大而导致Java占用太多内存,那么您应该考虑第四个选项:使用缓存管理器。

答案 2 :(得分:2)

最明显的方法是使用类似ehcache的东西并将数据存储在其中。 ehcache是​​一个缓存管理器,它的工作原理很像哈希映射,除了可以调整缓存管理器以保存内存,将它们移动到磁盘,刷新它们,甚至通过插件将它们写入数据库等。取决于对象是否可序列化,以及你的应用程序是否可以处理没有数据(如果有必要再进行一次往返),但我相信一个缓存管理器比手动解决方案做得更好。

答案 3 :(得分:1)

如果您的缓存变得足够大并且您经常访问它,那么使用一些缓存解决方案是合理的。例如,ehcache也是一个很好的候选者,并且很容易与Spring应用程序集成。文档为here

同时检查this overview用于Java的开源缓存解决方案。