我们在项目中使用了hibernate4和ehcache.我们主要处理不可变对象,因此缓存是一个非常适合我们的应用程序的功能.在尝试启用查询缓存时,我们遇到了以下问题:
假设我们有以下实体:
@Entity
@Table(name = "DOGS")
@Immutable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
class Dog {
@Id @Column
Long id;
@Column
String name;
}
Run Code Online (Sandbox Code Playgroud)
和查询:
Criteria criteria = session.createCriteria(Dog.class);
criteria.add(Restrictions.in("id", ids));
criteria.setCacheable(true);
Run Code Online (Sandbox Code Playgroud)
查询缓存timeToLive设置为Dog timeToLive的大约3/4.这是场景(如果我作出了错误的假设,请纠正我):
第三点是烦我.查询缓存无效并在数据库上重新运行,获取Dog对象,但Dog对象未在L2缓存中更新.看起来查询只更新了查询缓存中的dog ID,而不是L2缓存.
有没有办法强制查询更新L2缓存?也许这种情况要区别对待?
在一个spring mvc项目中,我想将一个@Controller注入一个不同的bean,如下所示:
@Controller
public class MyController {
..
}
@Component
public class SomeSpringBean {
@Resource
private MyController myController;
..
}
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,虽然@Controller注释是@Component的特化,就像@Service(它可以工作)一样:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com..Mycontroller] is defined
Run Code Online (Sandbox Code Playgroud)
我也尝试直接从ApplicationContext获取bean.
我想避免讨论为什么我要注入控制器,我宁愿创建一个额外的抽象级别,而是注入它:)