如何在Grails中创建缓存?

时间:2012-02-27 15:48:23

标签: grails groovy

这是我正在尝试或正在做的事情,我只是在页面中显示约100 tasks个实例。显示的任务是链接(可点击),点击它将进入特定的tasks实例显示页面。从该节目页面,用户可以返回他/她之前的页面,即显示100 tasks的页面。

现在这次我再次从DB获取这100个任务实例,我需要一种方法来“缓存”它们,这样就不需要再次获取了。有办法吗?

编辑:

def user = User.get(springSecurityService.principal.id)
         sleep(1000)
          params.max = Math.min(params.max ? params.int('max') : 10, 100)
         def tasks = Tasks.findAllByIsReadAndUser(false,user,[cache:true],params)
         def tasksCount = Tasks.createCriteria().list(max: params.max as Integer, offset: params.offset as Integer) {
             and {
                 eq('user',user)
                 eq('isRead',false)
             }
         }
         if(request.xhr) {
            render(view:'scroll', model:[userTasks:tasks,tasksCount: tasksCount.getTotalCount()])
         }
         else
         {
            [userTasks: tasks, tasksCount: tasksCount.getTotalCount()]
         }
    }

值得注意的是,我有这个代码,如果用户点击页面底部的滚动条并获取更多数据,该代码就可以运行:

 (function() {
                      jQuery(function() {
                        return $(window).scroll(function() {
                          var url;
                          url = $('.pagination .nextLink').attr('href');
                          if (url && $(window).scrollTop() > $(document).height() - $(window).height() - 50) {
                            $('.pagination').show();
                            $('.pagination').text('Fetching more data please wait...');
                            return $.get(url, function(data) {
                              $('#scrolling').append(data);
                              return $('.pagination').hide();
                            });
                          }
                        });
                      });
                    }).call(this);

现在的问题是,即使在我的控制器代码和缓存中添加了cache:true,由于这个jquery代码,我再次获取数据!

如何阻止此事?

提前致谢。

2 个答案:

答案 0 :(得分:3)

Grails支持hibernate二级缓存。您可以在域对象中启用它,例如:

class Book {
    …
    static mapping = {
        cache true
    }
}

有关详细信息,请查看Database Mapping - cache5.5.2.2 Caching Strategy

答案 1 :(得分:0)

cache:true参数将域对象缓存在Hibernate的L2缓存中。这是应用程序和数据库之间的缓存。换句话说,如果再次从Grails中获取相同的对象,它将从内存中获取对象(L2缓存),而不是再次查询数据库。

这不会在浏览器和应用程序之间缓存请求。幸运的是,浏览器已经有了一个用于此目的的缓存。