Hibernate 再接触 性能优化

Sessionclear

否则session缓存里越来越多

Java有内存泄露吗?

在语法中没有(垃圾自动回收) 但是在实际中会有 比如读文件没有关什么的 

1+N问题

 

 解决方法:把fetch设置为lazy 什么时候就为空

Bachsize 只是缓解 

使用joinfetch

Category

package com.bjsxt.hibernate;

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

import org.hibernate.annotations.BatchSize;

@Entity
//@BatchSize(size=5)
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

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

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 testSave() {
Session session = sf.openSession();
session.beginTransaction();

for(int i=0; i<10; i++) {
Category c = new Category();
c.setName("c" + i);
Topic t = new Topic();
t.setCategory(c);
t.setTitle("t" + i);
t.setCreateDate(new Date());
session.save(c);
session.save(t);
}

session.getTransaction().commit();
session.close();
}

//N+1
@Test
public void testQuery1() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
List<Topic> topics = (List<Topic>)session.createQuery("from Topic").list();


for(Topic t : topics) {
System.out.println(t.getId() + "-" + t.getTitle());
}
session.getTransaction().commit();
session.close();

}

@Test
public void testQuery2() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
List<Topic> topics = (List<Topic>)session.createQuery("from Topic").list();


for(Topic t : topics) {
System.out.println(t.getId() + "-" + t.getTitle());
System.out.println(t.getCategory().getName());
}
session.getTransaction().commit();
session.close();

}

//@BatchSize
@Test
public void testQuery3() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
List<Topic> topics = (List<Topic>)session.createQuery("from Topic").list();

for(Topic t : topics) {
System.out.println(t.getId() + "-" + t.getTitle());
System.out.println(t.getCategory().getName());
}
session.getTransaction().commit();
session.close();

}
//join fetch
@Test
public void testQuery4() {
Session session = sf.openSession();
session.beginTransaction();
//List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
List<Topic> topics = (List<Topic>)session.createQuery("from Topic t left join fetch t.category c").list();

for(Topic t : topics) {
System.out.println(t.getId() + "-" + t.getTitle());
System.out.println(t.getCategory().getName());
}
session.getTransaction().commit();
session.close();

}
public static void main(String[] args) {
beforeClass();
}


list是马上取出来 而iterator是在用的时候才取 不占缓存  

Category

package com.bjsxt.hibernate;

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

import org.hibernate.annotations.BatchSize;

@Entity
//@BatchSize(size=5)
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

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

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 testQueryList() {
        Session session = sf.openSession();
        session.beginTransaction();
        //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();   //发一次select
        List<Category> categories = (List<Category>)session.createQuery("from Category").list();   //找出来 但是不查找
        
        for(Category c : categories) {
            System.out.println(c.getName());     //用的时候才发select
        }
        
        List<Category> categories2 = (List<Category>)session.createQuery("from Category").list();  //再一次faselect
        for(Category c : categories2) {
            System.out.println(c.getName());
        }
        session.getTransaction().commit();
        session.close();
        
    }
    
    //join fetch
    @Test
    public void testQueryIterate() {
        Session session = sf.openSession();
        session.beginTransaction();
        //List<Topic> topics = (List<Topic>)session.createCriteria(Topic.class).list();
        Iterator<Category> categories = (Iterator<Category>)session.createQuery("from Category").iterate();
        
        
        while(categories.hasNext()) {
            Category c = categories.next();
            System.out.println(c.getName());
        }
        
        Iterator<Category> categories2 = (Iterator<Category>)session.createQuery("from Category").iterate(); //从session缓存里面找
        
        while(categories2.hasNext()) {
            Category c = categories2.next();
            System.out.println(c.getName());
        }
        session.getTransaction().commit();
        session.close();
        
    }

 

posted @ 2018-09-07 20:45  橘柑之味  阅读(85)  评论(0编辑  收藏  举报