通过示例缓存

时间:2015-05-28 15:01:58

标签: java hibernate caching hibernate-criteria hibernate-cache

我有以下Mapped实体:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "eKey-field-1", "eKey-field-2", "eKey-field-3" }))
class EntityMapped {
    @Id
    @GeneratedValue...
    Long Id;

    @Embedded
    EntityKeyMapped eKey;

没有更新也没有删除。如果给定的eKey没有安全性,则添加新记录。

选择查询非常简单,但每天最多并行执行1个Mln查询(+有时会添加新记录)。所以我想以某种方式缓存它。

在道内,我看到的是:

return (EntityMapped) getSession().createCriteria(EntityMapped.class).add(Example.create(example)).uniqueResult();

我正在考虑缓存此请求的最佳方法。 Atm我认为:

return (EntityMapped) getSession().createCriteria(EntityMapped.class).add(Example.create(example)).setCacheable(true).uniqueResult();

但也许在这种情况下有一种更好(更简单)的缓存方式?

1 个答案:

答案 0 :(得分:1)

您正在以适当的方式启用缓存。这就是Hibernate团队设计的方式。

如果您使用spring(或com.googlecode.ehcache.annotations等),则可以通过在方法上添加注释来启用缓存。但是,这将超出休眠状态。

使用纯休眠时,您的解决方案是正确的。

要记住的一件事是你可以启用缓存和设置适当的区域来使用:

return (SecurityMapped) getSession()
  .createCriteria(SecurityMapped.class)
  .add(Example.create(example))
  .setCacheable(true)
  .setCacheRegion("myregion")   // here you can choose region
  .uniqueResult();

然后在您的缓存提供程序配置文件中,您可以配置不同的区域。

例如,在EhCache配置中,您可以通过以下方式设置"myregion"

<ehcache ...>

    <cache name="myregion" 
           maxElementsInMemory="1000" 
           eternal="false" 
           timeToIdleSeconds="3600" 
           timeToLiveSeconds="7200" 
           overflowToDisk="false" 
           memoryStoreEvictionPolicy="LFU"/>

</ehcache>