hiberante入门(十四):缓存一
hiberante入门(十四):缓存1package com.asm.hibernate.test.cacheTestpublic class CacheSimulate {stati
hiberante入门(十四):缓存1
package com.asm.hibernate.test.cacheTest;public class CacheSimulate {static Map cache = new HashMap();public static void main(String[] args) {addUser();//第一次查询,会去连接数据库查询User u1 = getUser(1);//第二次查询,直接从Map cache中取User u2 = getUser(1);//第三次查询,同样从cache中直接取User u3 = getUser(1);}static User getUser(int id) {String key = User.class.getName() + id;User user = (User) cache.get(key);if (user != null)return user;user = getUserFromDB(id);cache.put(key, user);return user;}static void addUser() {省略代码,此方法的作用主要是向数据库添加一条记录,以方便查询操作}static User getUserFromDB(int id) {省略代码,作用就是真正去查数据}}?
package com.asm.hibernate.test.cacheTest;public class HibernateCacheTest {public static void main(String[] args) {addUser();getUser(1);}static User getUser(int id) {Session s = null;User user = null;try {s = HibernateUtil.getSession();user = (User) s.get(User.class, id);System.out.println("userName:" + user.getName());// session缓存,当session未关闭时,再查询直接从缓存中获得数据。user = (User) s.get(User.class, id);System.out.println("userName:" + user.getName());// 如果我们清掉缓存,再查询时将会重新连库。s.evict(user);// 清掉指定的数据// s.clear();//清掉当前session缓存中的所有内容user = (User) s.get(User.class, id);System.out.println("userName:" + user.getName());} finally {if (s != null)s.close();}// 当上面的session关闭后,如果想再获取前面查询的数据,必须重新查库。try {s = HibernateUtil.getSession();user = (User) s.get(User.class, id);System.out.println("userName:" + user.getName());} finally {if (s != null)s.close();}return user;}static void addUser() {User user = new User();user.setName("genName");HibernateUtil.add(user);}}nonstrict-read-write: 如果应用程序只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存
策略。
transactional: Hibernate的事务缓存策略提供了全事务的缓存支持,例如对JBoss TreeCache的支持。这样的缓存只能用于JTA环境中,你必须指定为其hibernate.transaction.manager_lookup_class属性。