小编Woj*_*ski的帖子

Hibernate缓存:缓存查询返回的对象是否存储在L2缓存中?

我们在项目中使用了hibernate4ehcache.我们主要处理不可变对象,因此缓存是一个非常适合我们的应用程序的功能.在尝试启用查询缓存时,我们遇到了以下问题:

假设我们有以下实体:

@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.这是场景(如果我作出了错误的假设,请纠正我):

  1. 第一次调用查询(假设缓存为空),执行它并将返回的Dog实例存储在二级缓存中.此外,Dog ID存储在查询缓存中.
  2. 第二次调用查询(Dog ID在查询缓存中,Dog对象在L2缓存中),一切正常.查询缓存返回id,并从L2获取Dogs.
  3. 当查询缓存过期(但L2缓存仍然有效)时,查询将重新运行并缓存Dog ID.
  4. 现在L2缓存为Dog对象过期,所有对象都从缓存中逐出.查询缓存仍然具有缓存的ID,因此hibernate 逐个获取Dog对象,这需要永远.

第三点是烦我.查询缓存无效并在数据库上重新运行,获取Dog对象,但Dog对象未在L2缓存中更新.看起来查询只更新了查询缓存中的dog ID,而不是L2缓存.

有没有办法强制查询更新L2缓存?也许这种情况要区别对待?

java hibernate ehcache

8
推荐指数
1
解决办法
1344
查看次数

将@Controller注入另一个spring bean

在一个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.

我想避免讨论为什么我要注入控制器,我宁愿创建一个额外的抽象级别,而是注入它:)

java spring dependency-injection spring-mvc

7
推荐指数
1
解决办法
3415
查看次数