我有以下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();
但也许在这种情况下有一种更好(更简单)的缓存方式?
答案 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>