这是我正在尝试或正在做的事情,我只是在页面中显示约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代码,我再次获取数据!
如何阻止此事?
提前致谢。
答案 0 :(得分:3)
Grails支持hibernate二级缓存。您可以在域对象中启用它,例如:
class Book {
…
static mapping = {
cache true
}
}
答案 1 :(得分:0)
cache:true
参数将域对象缓存在Hibernate的L2缓存中。这是应用程序和数据库之间的缓存。换句话说,如果再次从Grails中获取相同的对象,它将从内存中获取对象(L2缓存),而不是再次查询数据库。
这不会在浏览器和应用程序之间缓存请求。幸运的是,浏览器已经有了一个用于此目的的缓存。