hibernate query by example 缓存

hibernate query by example caching

我有以下映射实体:

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

    @Embedded
    EntityKeyMapped eKey;

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

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

在 Dao 中,我看到类似的东西:

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();

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

您正在以正确的方式启用缓存。这是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>