Java EHCache如何检查缓存中是否有内容?

Java EHCache如何检查缓存中是否有内容?,java,spring,caching,ehcache,Java,Spring,Caching,Ehcache,有没有办法检查对象是否在EHCache托管缓存中 我面临的挑战是,我实现了一个从数据库中检索单个值的方法(find(key)方法)。该find方法的结果由EHCache很好地缓存,但是现在我想减少多次调用该方法所导致的SQL查询的数量 因此,为了实现这一点,我们实现了一个新方法,该方法作为参数获取一个键列表,但由于每个方法调用的参数不同,EHCache在缓存结果方面做得不好。 EHCache使用方法参数作为缓存的入口点 所以我想重新设计一些东西。我的想法是,我在find(键列表)方法中获取参数,

有没有办法检查对象是否在EHCache托管缓存中

我面临的挑战是,我实现了一个从数据库中检索单个值的方法(find(key)方法)。该find方法的结果由EHCache很好地缓存,但是现在我想减少多次调用该方法所导致的SQL查询的数量

因此,为了实现这一点,我们实现了一个新方法,该方法作为参数获取一个键列表,但由于每个方法调用的参数不同,EHCache在缓存结果方面做得不好。 EHCache使用方法参数作为缓存的入口点

所以我想重新设计一些东西。我的想法是,我在find(键列表)方法中获取参数,执行一个大型SQL查询,然后将结果填充到缓存中,我并没有对其绞尽脑汁,但写下来之后,感觉手动修改缓存也是不可能的


任何见解或提示都将不胜感激

也许吧?

您看过
自填充缓存和/或块缓存吗?在数据库检索启动后,它们将阻止所有辅助请求程序,直到缓存被填充。

可以通过jmx访问hibernate statistics+ehcache stats等。ehcachehibernatemban是通过jmx公开所有API的主接口。它基本上扩展了两个接口——EhcacheStats和hibernatests。顾名思义,EhcacheStats包含与Ehcache相关的方法和与Hibernate相关的hibernatests。您可以看到缓存命中/未命中/放入速率、动态更改配置元素值——如maxElementInMemory、TTI、TTL、启用/禁用统计信息收集等。在Hibernate配置中启用二级缓存时,通过将tc.active添加为“true”系统属性,覆盖LocalSessionFactoryBean上的buildSessionFactory()方法,可以在应用程序中实现这一点

  @Override
        protected SessionFactory buildSessionFactory() throws Exception {
                Properties properties = this.getHibernateProperties();
                String secondLevelCache = (String) properties
                                .get("hibernate.cache.use_second_level_cache");
                if (secondLevelCache.equals("true")) {
                        System.setProperty("tc.active", "true");
                }
                return super.buildSessionFactory();
        }
否当您通过JMX访问应用程序时,转到选项卡Mbeans,在左侧转到net.sf.ehcache.hibernate-->net.sf.ehcache。Cachemanager@..

在下面转到属性。 单击属性并在右侧检查RegionCacheAttriutes


注意:视图已使用JDK1.7更改。登录JMX控制台后,导航到Mbeans选项卡下的net.sf.ehcache.hibernate。单击CacheRegionStats单击它将打开右侧的屏幕。双击顶部部分,它将显示表格导航,如下所示。您必须在表格导航中导航,才能找到您感兴趣的任何对象的计数。

为什么要知道它?理想情况下,缓存对消费者是隐藏的,因此它的名称。你说的“内部”是什么意思?作为一个键,还是作为一个值?请小心,isKeyInCache将导致过期逻辑运行。密钥可能会被列为存在,但在返回该方法时,它将使条目过期,并且缓存将不再包含该元素。不久前我就被这个问题困扰了。@Dave:javadoc对此非常清楚——“因为没有对元素的状态做出断言,所以元素可能已过期,但此方法仍然返回true。”@skaffman是的-不幸的是,我读了文档/after/I被它烧坏了,并且发现了我的错误配置试图拯救痛苦:-)这对于任何并发缓存实现来说都是非常正确的:仅仅因为你现在看到了它,但这并不意味着它会在以后出现。我认为检查缓存中是否有东西没有任何问题。请注意,根据缓存的配置方式,缓存中的某些内容可能会在一分钟后消失。