我有java servlet从mysql数据库中检索数据。为了最小化到数据库的往返,它只在init()方法中检索一次,并被放置到HashMap<> (即缓存在内存中)。
现在,这个HashMap是servlet类的成员。我不仅需要存储此数据,还需要更新基础hashmap值类的缓存对象中的某些值(实际上是计数器)。并且有一个Timer(或Cron任务)来安排将这些计数器转储到DB。
因此,在谷歌搜索后,我找到了3个存储缓存数据的选项:
1)就像现在一样,作为servlet类的成员(但servlet可以停止服务并随意由容器重新投入使用。然后数据将丢失)
2)在 ServletContext (我是对的,建议在这里存储少量数据吗?)
3)在 JNDI资源。
中最喜欢的方式是什么?
答案 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的开源缓存解决方案。