0

我继续我之前提出的问题(下面的链接)

Spring MVC - 在服务器启动时从数据库中获取参考数据

在获得早期帖子的一些建议后,我认为我可以用来加载参考数据的方法是,在 ArticleController (我的控制器类)中添加以下方法

    @ModelAttribute
    public void populateModel(@RequestParam String number, Model model) {
        model.addAttribute("countryList", articleService.getCountryList());
        model.addAttribute("skillsList", articleService.getSkillsList());
    }

然后使用如下所示的休眠二级缓存,

    @Entity
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
    public class Country {
        ...
    }

同样适用于技能类

我有三个问题

  1. populateModel 方法 (@ModelAttribute) 会只执行一次吗?即在 ArticleController 类上执行第一个 @RequestMapping 方法之前(对于多个会话中的所有请求 - 我在日志跟踪中看到 ArticleController 在我启动服务器时被初始化)?
  2. 除了我提到的实现二级缓存之外,我还需要做更多的事情吗?(contry 列表和技能列表是两个单独的表中的纯只读数据)
  3. 我错过的任何小点,您都可以提供建议。
4

2 回答 2

0
  1. 不会。如文档中所述,将为每个请求调用该方法。顺便说一句,如果它只被调用一次,它将在哪里找到请求参数(你不使用,顺便说一句)?

  2. 如果除了二级缓存之外没有开启查询缓存,并且使查询可缓存,那么Hibernate每次都会执行一个SQL查询从数据库中加载国家ID,然后再从数据库中加载实体本身。二级缓存。如果启用了查询缓存并且查询是可缓存的,那么 Hibernate 将执行单个查询以加载缓存中的所有国家/地区,之后不再执行任何查询(至少对于缓存区域的 TTL)

  3. 我想我已经做了我能做的:-)。您可以阅读以下文章以获得更好的理解。

于 2012-12-02T13:11:56.243 回答
0

针对问题 1,此方法:

@ModelAttribute
    public void populateModel(@RequestParam String number, Model model) {
        model.addAttribute("countryList", articleService.getCountryList());
        model.addAttribute("skillsList", articleService.getSkillsList());
    }

标有@ModelAttribute 注释。这意味着每次调用此控制器中的任何 @RequestMapping 注释方法时,都会(之前)执行该方法。

如果您要缓存一些模型属性,最好将它们公开为 @RequestMapping 方法。

于 2015-10-16T15:11:32.923 回答