2014-01-20 130 views
0

我有一个表,Users,主键为id :: int4,自然键为password :: varchar(32)。我想使用Hibernate尽可能快地检查数据库中的组合idpassword是否存在一行。休眠L2查询缓存:不要在缓存中缺少命中数据库

所以我加载所有用户的L2高速缓存,并做

User u = (User)session.get(User.class, uId); 
if (!u.getPassword().equals(pass)) { 
    // fail when passwords are not equal 
} 

这是一件好事,当缓存被击中,但在高速缓存未命中(这意味着输入数据错误),这将触发select查询。如果在缓存中没有找到值,我怎么才能指出hibernate不要命中数据库?

我看到一个选项,直接从缓存中加载用户,然后使用类似session.merge()它。但也许有更好的方法?

PS。我还有一个抱怨。如果密码不相同,我的用户对象脱水时性能会降低(尚未进行配置)。这也可以消除?

回答

0

您正在使用二级缓存来反对它的意图:缓存经历一次未命中通常是合法的。就其性质而言,缓存不保证是整个表的100%副本。

如果您想要一个完整的用户表的可靠副本,然后构建您自己的HashMap<String,String>