Hibernate 再接触 一级缓存 二级缓存 查询缓存

缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读

一级缓存:

session缓存

二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大)

很多的session缓存  找不到再去数据库拿

开启二级缓存

查询缓存 比如说 我查的是2-8的数据 然后呢我又查了3-9的数据 则3-8的数据就是查询缓存,三级缓存

缓存算法

内存对象满了 拿走什么

Lru Lfu fifo

1.最近很少被使用

2.最近不常被使用

3.缓存对象设置一个数组 来一个把第一个推走

例子

Category.java

package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
//@BatchSize(size=5)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Category {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

Msg.java

package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Msg {
    private int id;
    private String cont;
    private Topic topic;
    @ManyToOne
    public Topic getTopic() {
        return topic;
    }
    public void setTopic(Topic topic) {
        this.topic = topic;
    }
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    
    public String getCont() {
        return cont;
    }
    public void setCont(String cont) {
        this.cont = cont;
    }
    
}

Msginfo.java

package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;


public class MsgInfo {
    private int id;
    private String cont;
    private String topicName;
    private String categoryName;
    public MsgInfo(int id, String cont, String topicName, String categoryName) {
        super();
        this.id = id;
        this.cont = cont;
        this.topicName = topicName;
        this.categoryName = categoryName;
    }
    public String getTopicName() {
        return topicName;
    }
    public void setTopicName(String topicName) {
        this.topicName = topicName;
    }
    public String getCategoryName() {
        return categoryName;
    }
    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    
    public String getCont() {
        return cont;
    }
    public void setCont(String cont) {
        this.cont = cont;
    }
    
}

Topic.java

package com.bjsxt.hibernate;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

import org.hibernate.annotations.BatchSize;

@Entity
@NamedQueries(
        {
            @NamedQuery(name="topic.selectCertainTopic", query="from Topic t where t.id = :id")
        }
        )
        /*
@NamedNativeQueries(
        {
            @NamedNativeQuery(name="topic.select2_5Topic", query="select * from topic limit 2, 5")
        }
        )
        */

public class Topic {
    private int id;
    private String title;
    private Category category;
    private Date createDate;
    private List<Msg> msgs = new ArrayList<Msg>();
    @OneToMany(mappedBy="topic")
    public List<Msg> getMsgs() {
        
        return msgs;
    }
    public void setMsgs(List<Msg> msgs) {
        this.msgs = msgs;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    @ManyToOne    
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    
}
@Test
    public void testCache1() {
        Session session = sf.openSession();
        session.beginTransaction();
        Category c = (Category)session.load(Category.class, 1);
        System.out.println(c.getName());
        
        Category c2 = (Category)session.load(Category.class, 1);   //一级缓存
        System.out.println(c2.getName());
        session.getTransaction().commit();
        session.close();
        
    }
    
    //join fetch
    @Test
    public void testCache2() {
        Session session = sf.openSession();
        session.beginTransaction();
        Category c = (Category)session.load(Category.class, 1);
        System.out.println(c.getName());
        
        
        session.getTransaction().commit();
        session.close();
        
        Session session2 = sf.openSession();
        session2.beginTransaction();
        Category c2 = (Category)session2.load(Category.class, 1); //两个session 打开二级缓存 也只发送一次select
        System.out.println(c2.getName());
        
        
        session2.getTransaction().commit();
        session2.close();
    }
    
    //join fetch
    @Test
    public void testQueryCache() {
        Session session = sf.openSession();
        session.beginTransaction();
        List<Category> categories = (List<Category>)session.createQuery("from Category")
                                    .setCacheable(true).list();
        
        
        
        session.getTransaction().commit();
        session.close();
        
        Session session2 = sf.openSession();
        session2.beginTransaction();
        List<Category> categories2 = (List<Category>)session2.createQuery("from Category")  //三级缓存,List也不会重新发select 把共用的存储起来
        .setCacheable(true).list();
        
        session2.getTransaction().commit();
        session2.close();
    }

 

原文地址:https://www.cnblogs.com/frankzone/p/9607144.html