zoukankan      html  css  js  c++  java
  • 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();
            
        }
  • 相关阅读:
    第十二章 圆周率的计算问题分析
    第十一章:random库概述
    【模板】分治 FFT
    [PKUWC2018]Slay the Spire
    [PKUWC2018]随机算法
    [PKUWC2018]Minimax
    线段树合并初探
    平衡树初探
    Luogu P1613 跑路 题解报告
    CH138 兔子和兔子 题解报告
  • 原文地址:https://www.cnblogs.com/frankzone/p/9606944.html
Copyright © 2011-2022 走看看