package com.mwy.ehcache.test;
import com.mwy.ehcache.util.EhcacheUtil;
public class EhcacheDemo2 {
public static void main(String[] args) {
//默认的临时文件路径
System.out.println(System.getProperty("java.io.tmpdir"));
EhcacheUtil.put("com.mwy.entity.Book", 11, "mwy");
System.out.println(EhcacheUtil.get("com.mwy.entity.Book", 11));
}
}
结果(存到默认的临时文件路径)
⑤、将结果指定在硬盘上存储对象的路径
代码
package com.mwy.ehcache.test;
import com.mwy.ehcache.util.EhcacheUtil;
public class EhcacheDemo2 {
public static void main(String[] args) {
//默认的临时文件路径
System.out.println(System.getProperty("java.io.tmpdir"));
EhcacheUtil.put("com.mi.entity.User", 11, "mwy");
System.out.println(EhcacheUtil.get("com.mi.entity.User", 11));
}
}
修改ehcache.xml
得到结果(存储到了指定硬盘)
2、hibernate使用echcache作为二级缓存
演示一个现象:
同一个session,sql语句只生成一次,这里用到了一级缓存
①、默认一级缓存:session级别的缓存
@Test
public void test1() {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 7);
System.out.println(user);
User user2 = session.get(User.class, 7);
System.out.println(user2);
User user3 = session.get(User.class, 7);
System.out.println(user3);
transaction.commit();
session.close();
}
结果只会执行一个sql得到三个结果
原因:当第一个session执行后,获得了结果,第二个执行的时候,会获取上一个session的副本
因而只会执行一个sql;
②、sessionFactory二级缓存
第一步:核心配置文件(hibernate.cfg.xml)
true
true
org.hibernate.cache.ehcache.EhCacheRegionFactory
第二步:二级缓存并不是随便用的,内存是有限的(并不是每一个表使用的实体类都要使用二级缓存)
由于要使用User实体类,就要在它的映射文件(User.hbm,xml)中进行配置
要保持一致
ehcache.xml中也要保持一致
使用的Dao(UserDao )
package com.mwy.ehcache.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.mwy.entity.User;
import com.mwy.util.SessionFactoryUtil;
public class UserDao {
public User get(User user) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
User u = session.get(User.class, user.getId());
transaction.commit();
session.close();
return u;
}
}
测试
@Test
public void test2() {
UserDao userDao = new UserDao();
User u = new User();
u.setId(7);
User user = userDao.get(u);
System.out.println(user);
User user2 = userDao.get(u);
System.out.println(user2);
User user3 = userDao.get(u);
System.out.println(user3);
}
得到结果:
3、hibernate多条记录缓存
①、hibernate二级缓存不会同时缓存多条数据
public static void main(String[] args) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from User");
List list = query.list();
System.out.println(list);
List list2 = query.list();
System.out.println(list2);
List list3 = query.list();
System.out.println(list3);
transaction.commit();
session.close();
}