有没有办法配置Amazon EC2实例以支持EhCache自动发现所需的多播?(通过iptables hacks等)/
在EhCache中,向缓存添加元素时:
cache.put(new Element("key1", "value1"));
// Element constructors :
Element(Object key, Object value)
Run Code Online (Sandbox Code Playgroud)
我看到我可以给出一个Object关键指数.
我如何使用它来拥有一个"复杂"键,由多个int组成:(userId,siteId,...)而不是字符串作为索引?
谢谢
我需要经常访问耗时计算的结果.结果不经常更改,因此我不得不不时重新计算数据,但可以暂时使用过时的结果.最简单的方法是什么?现有的库方法或设计模式是什么?
我在想类似的东西
private static List myCachedList = null;
...
// refresh list once in 3600 seconds
if (needsRefresh(myCachedList, 3600)) {
// run the calculation
myCachedList = ...
}
// use either updated or previous value from here on
Run Code Online (Sandbox Code Playgroud)
一个正确的实现可能不是微不足道的,它可能必须处理线程安全,竞争条件等,所以我宁愿使用一个经过验证的实现,而不是在我自己.
我正在使用Hibernate 5.1.0.Final和ehcache以及Spring 3.2.11.RELEASE.我@Cacheable在其中一个中设置了以下注释DAO:
@Override
@Cacheable(value = "main")
public Item findItemById(String id)
{
return entityManager.find(Item.class, id);
}
Run Code Online (Sandbox Code Playgroud)
返回的项目有许多关联,其中一些是懒惰的.例如,它(最终)引用该字段:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "product_category", joinColumns = { @JoinColumn(name = "PRODUCT_ID") }, inverseJoinColumns = { @JoinColumn(name = "CATEGORY_ID") })
private List<Category> categories;
Run Code Online (Sandbox Code Playgroud)
我注意到在我标记的一个方法中@Transactional,当从二级缓存中检索到上述方法时,我在尝试迭代categories字段时得到以下异常:
@Transactional(readOnly=true)
public UserContentDto getContent(String itemId, String pageNumber) throws IOException
{
Item Item = contentDao.findItemById(ItemId);
…
// Below line causes a “LazyInitializationException” exception
for (Category category : item.getParent().getProduct().getCategories())
{
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪是:
16:29:42,557 INFO [org.directwebremoting.log.accessLog] (ajp-/127.0.0.1:8009-18) …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用JBoss Cache或Ehcache来实现缓存.在查看这两个API后,我直觉认为JBoss可能比Ehcache更有效,因为它可以将原始对象放入缓存,而Ehcache需要将数据包装在Element对象中.
我设置了一个快速的工作台,在缓存中重复插入密钥,值元组.键和值类非常简单:
键:
public class Key implements Serializable {
private static final long serialVersionUID = -2124973847139523943L;
private final int key;
public Key(int pValue) {
this.key = pValue;
}
public int getValue() {
return this.key;
}
@Override
public String toString() {
return "Key [key=" + this.key + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
值:
public class Value implements Serializable{
/**
* serialVersionUID
*/
private static final long serialVersionUID = -499278480347842883L;
}
Run Code Online (Sandbox Code Playgroud)
当将100000个对象的结果插入到内存中时,Ehcache使用13396个字节来存储对象,而JBoss使用5712个字节进行相同的操作(由于使用了ConcurrentHashMap5680字节的相同测试,因此很好).
然而,当我查看执行时间时,我有一个非常糟糕的惊喜:Ehcache需要300毫秒来执行测试,而JBossCache需要44秒才能执行相同操作.我很确定我的JBoss配置中有一些东西在解释这种差异.
Ehcache以编程方式初始化如下:
CacheConfiguration cacheConfiguration = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将应用程序从Hibernate 3升级到Hibernate 4.该应用程序使用ehcache.
升级到Hibernate 4.2.0.Final时,我按照建议添加了对hibernate-ehcache-4.2.0.Final的依赖.
当我启动应用程序时,我收到以下错误:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/cache/TimestampsRegion
Run Code Online (Sandbox Code Playgroud)
根据http://www.javacraft.org/2012/03/migrate-to-hibernate-4-ehcache.html我应该删除对ehcache-core的依赖,只使用hibernate提供的jar来解决这个错误.
现在,如果我按照这些说明删除此依赖项,则使用net.sf.ehcache.CacheManager的应用程序不再编译.
// For example, this no-longer works
CacheManager manager = CacheManager.getInstance();
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我可以使用这两个库并继续像以前一样工作(不更新应用程序),或者我是否必须更改应用程序,在这种情况下hibernate-ehcache甚至提供访问缓存所需的功能?
我想在我的分布式Web应用程序中使用spring cache abstraction.
我的Web应用程序由一个Web应用程序组成,该应用程序在带有负载均衡器的3个不同的tomcats上运行.
现在,我的问题是当另一个tomcat执行更新时,@Evict如何在所有tomcats中缓存?
春天是否支持这种事情?
谢谢!
ehcache doc(http://ehcache.org/documentation/configuration/cache-size)将maxEntriesLocalHeap描述为
高速缓存可以在本地堆内存中使用的最大高速缓存条目数或字节数,或者,当设置为CacheManager级别(仅限maxBytesLocalHeap)时,可用于该CacheManager下的所有高速缓存的本地池.每个缓存或CacheManager级别都需要此设置.
这是否意味着对于此配置:
<cache
name="myCache"
maxEntriesLocalHeap="5000"
eternal="false"
overflowToDisk="false"
timeToLiveSeconds="10000"
memoryStoreEvictionPolicy="FIFO" />
Run Code Online (Sandbox Code Playgroud)
可以添加到缓存的最大对象数为5000.这些对象可以包含多个子对象,但只添加顶级父对象作为条目.因此,如果每个对象都引用了另外两个对象,那么maxEntriesLocalHeap对象的数量可能会增加到15000(此时最旧的对象会在添加新对象时被换出).它是否正确 ?
我正在使用Spring和EhCache
我有以下方法
@Override
@Cacheable(value="products", key="#root.target.PRODUCTS")
public Set<Product> findAll() {
return new LinkedHashSet<>(this.productRepository.findAll());
}
Run Code Online (Sandbox Code Playgroud)
我有其他使用@Cacheable和@CachePut以及@CacheEvict的方法.
现在,假设数据库返回100个产品并且它们被缓存key="#root.target.PRODUCTS",然后其他方法将插入 - 更新 - 删除项目到数据库中.因此,通过它缓存的产品key="#root.target.PRODUCTS"不再相同,例如数据库.
我的意思是,检查以下两种方法,他们能够更新/删除一个项目,同一项目缓存在另一个key="#root.target.PRODUCTS"
@Override
@CachePut(value="products", key="#product.id")
public Product update(Product product) {
return this.productRepository.save(product);
}
@Override
@CacheEvict(value="products", key="#id")
public void delete(Integer id) {
this.productRepository.delete(id);
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以通过更新/删除位于缓存中的项目key="#root.target.PRODUCTS",如果产品已更新,则为100,如果删除了产品,则为499.
我的观点是,我想避免以下情况:
@Override
@CachePut(value="products", key="#product.id")
@CacheEvict(value="products", key="#root.target.PRODUCTS")
public Product update(Product product) {
return this.productRepository.save(product);
}
@Override
@Caching(evict={
@CacheEvict(value="products", key="#id"),
@CacheEvict(value="products", key="#root.target.PRODUCTS")
})
public void delete(Integer id) {
this.productRepository.delete(id); …Run Code Online (Sandbox Code Playgroud) 很快,我有一个实体映射到 DB (Oracle) 中的视图,并启用了第二级缓存(只读策略)——ehcache。
如果我手动更新数据库中的某些列 - 缓存将不会更新。
我没有找到任何方法来做到这一点。仅当更新将通过 Hibernate 实体完成时。
我可以以某种方式实现这个功能吗?
也许工作来监视表(或视图)?或者也许有一些方法可以通知 Hibernate 关于具体表中 DB 的变化。
感谢未来的答案!
ehcache ×10
java ×7
caching ×5
spring ×4
hibernate ×3
amazon-ec2 ×1
jboss-cache ×1
memcached ×1
multicast ×1
oracle ×1
performance ×1
spring-3 ×1
spring-cache ×1
tomcat ×1