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

发布于 2024-09-17 05:12:41 字数 461 浏览 6 评论 0原文

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

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

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

1)像现在一样,作为 servlet 类的成员(但是 servlet 可以从服务中取出并由容器重新投入使用,位于那么数据就会丢失)

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

3)在JNDI资源中。

最优选的方式是什么?

I have the java servlet that retrieves data from a mysql database. In order to minimize roundtrips to the database, it is retrieved only once in init() method, and is placed to a HashMap<> (i.e. cached in memory).

For now, this HashMap is a member of the servlet class. I need not only store this data but also update some values (counters in fact) in the cached objects of underlying hashmap value class. And there is a Timer (or Cron task) to schedule dumping these counters to DB.

So, after googling i found 3 options of storing the cached data:

1) as now, as a member of servlet class (but servlets can be taken out of service and put back into service by the container at will. Then the data will be lost)

2) in ServletContext (am i right that it is recommended to store small amounts of data here?)

3) in a JNDI resource.

What is the most preferred way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

唔猫 2024-09-24 05:12:42

将其放在 ServletContext 中,但使用 ConcurrentHashMap 来避免并发问题。

Put it in ServletContext But use ConcurrentHashMap to avoid concurrency issues.

怪我太投入 2024-09-24 05:12:42

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

如果数据变得太大以至于占用了太多 Java 内存,那么您应该考虑第四个选项:使用缓存管理器。

From those 3 options, the best is to store it in the application scope. I.e. use ServletContext#setAttribute(). You'd like to use a ServletContextListener for this. In normal servlets you can access the ServletContext by the inherited getServletContext() method. In JSP you can access it by ${attributename}.

If the data is getting excessive large that it eats too much of Java's memory, then you should consider a 4th option: use a cache manager.

苍风燃霜 2024-09-24 05:12:42

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

The most obvious way would be use something like ehcache and store the data in that. ehcache is a cache manager that works much like a hash map except the cache manager can be tweaked to hold things in memory, move them to disk, flush them, even write them into a database via a plugin etc. Depends if the objects are serializable, and whether your app can cope without data (i.e. make another round trip if necessary) but I would trust a cache manager to do a better job of it than a hand rolled solution.

始于初秋 2024-09-24 05:12:42

如果您的缓存足够大并且您经常访问它,那么使用某些缓存解决方案是合理的。例如,ehcache 就是一个很好的候选者,并且也可以轻松地与 Spring 应用程序集成。文档位于此处

另请查看 Java 开源缓存解决方案的此概述

If your cache can become large enough and you access it often it'll be reasonable to utilize some caching solution. For example ehcache is a good candidate and easily integrated with Spring applications, too. Documentation is here.

Also check this overview of open-source caching solutions for Java.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文