java - 企业 Web 应用程序中的缓存

标签 java sql spring caching

对于在供大量人员使用的大型程序中使用缓存,我还比较陌生。我知道什么是缓存以及为什么它总体上是有益的,并且我已经开始将 EHCache 集成到我使用 JSP 和 Spring MVC 的应用程序中。在我的应用程序中,用户从下拉列表中选择一个 ID,这使用 java 类根据选择的 ID 从数据库中获取数据。首先执行查询并返回一个 ResultSet 对象。此时我很困惑该做什么,感觉自己错过了一些东西。

我知道我希望该对象进入缓存(如果它还没有在缓存中),如果它已经在缓存中,则继续循环。但是这样做需要我迭代数据库查询返回的整个结果集,这显然不是应该做的事情?

那么,您是否建议我尝试缓存返回的整个结果集?如果我这样做,我想如果数据库表用新记录更新,我可以更新缓存中的列表?关于如何继续并将数据库返回的内容正确放入 ecache 有什么建议吗?

我知道我提出了很多问题,如果有人能提供一些帮助,我当然不胜感激!这是我的代码片段,以便您明白我的意思。

rs = sta.executeQuery(QUERYBRANCHES + specifier);

          while (rs.next())
            {

              //for each set of fields retrieved, use those to create a branch object.
                //String brName = rs.getString("NAME");
                String compareID = rs.getString("ID");
                String fixedRegID = rs.getString("REGIONID").replace("0", "").trim();

                //CHECKING IF BRANCH IS ALREADY IN THE CACHE. IF IT IS NOT CREATE
                //THE NEW OBJECT AND ADD IT TO CACHE. IF THE BRANCH IS IN CACHE THEN CONTINUE
                if(!cacheManager.isInMemory(compareID))
                {

                Branch branch = 
                        new Branch(fixedRegID, rs.getString("ID"), rs.getString("NAME"), rs.getString("ADDR1"), rs.getString("CITY"), rs.getString("ST"), rs.getString("ZIP"));




                cacheManager.addBranch(rs.getString("ID"), branch);
                }
                else
                {
                    continue;
                }
            }

          retData = cacheManager.getAllBranches();

最佳答案

But doing things this way requires me to iterate over the whole returned result set from the DB query, which is obviously not the way things are supposed to be done?

您需要迭代才能获取结果。

为了避免对所有元素进行迭代,您需要排除选择中返回的已缓存值。

我的意思是,添加到您的 select排除子句中包含您不需要的值,在本例中是已缓存的值。 ( not like<> 等)。这将减少迭代时间。

否则,如果您的 SQL 过滤器不完整,恐怕您将不得不迭代所有返回。

So, would you recommend that I just try to cache the whole result set returned? If I did this I guess I could update the list in the cache if the DB table is updated with a new record? Any suggestions on how to proceed and correctly put into ecache what is returned from the DB?

您不应缓存高度动态的业务信息。

我建议您使用数据库索引,这样可以显着提高性能,并从那里获取值。如果需要,请使用纯 native SQL。

如果您要与很多用户一起工作,您将需要大量内存来将所有这些对象保存在内存中。

当您开始水平扩展时,缓存管理将成为一个挑战。

如果可以的话,仅缓存不会更改或更改次数很少的值,例如应用程序启动或应用程序参数中的值。

如果您确实需要缓存业务信息,请告知我们具体情况,比如硬件、平台、数据库、格局、访问峰值等。

关于java - 企业 Web 应用程序中的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23840998/

相关文章:

java - 如何添加我的文本区域

mysql - 如何使用 WHERE 语句和 COUNT(*) = 1 选择行

SQL 每个月的第一天

java - 使用maven将storm和cassandra打包成可执行jar

java - 删除 ListView 项之间的间距

spring - 如何使用 Spring 的 RestTemplate 模拟 curl REST 调用?

java - 将全局变量 Hook 到 JSP (Spring) 中最优雅的方法是什么

java - 从 JMS header 获取字符串值

java - LG 设备上的 Android 6.0 (Marshmallow) 中的 new String(byte[]) 损坏?

mysql - 如何获取特定列未链接到另一个表的特定值的数据库表条目?