首页 文章

缓存(Ehcache) - Hibernate二级缓存和Spring

提问于
浏览
1

在我的Web应用程序(Spring 3.1,Hibernate 4)中,我使用Ehcache进行Hibernate二级缓存和Spring @Cache . 我想知道,在哪里使用Hibernate Cache和Spring Cache?

例如,我有几个域类(在数据库中查看),我在屏幕上使用它作为查找值 . 我可以使用Hibernate二级缓存和Spring @Cache缓存它们 .

因此,在我的服务层中,如果我使用Spring @Cache缓存这些域对象,我会收到这些对象,而不会在缓存时完全访问持久层(hibernate HQL查询) . 这是正确的方法吗?

2 回答

  • 4

    取决于您的图层架构 .

    假设您有三个服务(或同一服务中的三个方法)都返回 Customer 实体的集合,即域对象 . 如果在服务层缓存,则单个数据库记录的相同表示很可能会多次存在于缓存中 . 它们是基本相同信息的多个对象 . 为什么?因为 Service.getWhateverCustomers(String)Service.getWhateverCustomers(String, Integer) 的结果存储在两个不同的缓存键下 .

    另一方面,如果使用JPA @Cachable注释在实体级别进行缓存,则无论您使用哪种服务或服务方法调用实际检索实体的代码,都会缓存 Customer 实体 . 当然,关于JPA提供者何时/可以缓存实体的规则适用 . 如果你不熟悉它们,请阅读它们 .

    希望这能让您了解要遵循的路径 . 如果您有更多问题,请发布后续评论,我将编辑此答案 .

  • 0

    正确的方法是:

    • 问问自己是否需要搞乱缓存的复杂性 . 您的应用无法满足要求吗?

    • 仅当上一个问题的答案是"yes"时,才能对您的应用进行分析,以找出性能问题的位置 .

    • 确定解决步骤2中确定的性能问题的适当方法 . 它可能涉及也可能不涉及缓存以防止代价高昂的操作 . 如果它确实涉及缓存,那么缓存和使用哪个缓存的位置应该非常清楚,因为你试图阻止发生 .

    这个故事的寓意是你不酷 . 您缓存性能 . 而你only optimize code when it's proven necessary .

相关问题