Hibernate学习笔记_缓存

一级缓存和二级缓存和査询缓存(面试题)                

a)    什么是缓存

b)    什么是一级缓存,session级别的缓存

c)    什么是二级缓存,SessionFactory级别的缓存,可以跨越session存在

i.   经常被访间

ii.   改动不大不会经常改动

iii.   数重有限

d)    打开二级缓存

i.   hibernate.cfg.xml 设定:

<property name= "cache.use_second_level_cache">true</property>

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

ii.   @Cache注解(由hibernate扩展提供)

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

@Entity
//@BatchSize(size=5)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Category {
    private int id;
    private String name;
。。。。。。。。
}

注:使用EhCache二级缓存 需要导入ehcache-1.2.3.jar及commons-logging-1.0.4.jar包

e)    load默认使用二级缓存,iterate默认使用二级缓存

f)    list默认往二级缓存加数据,但是查询的时候不使用

g)    如果要query用二级缓存,需打开查询缓存

<property name="cache.use_query_cache">true</property>

调用Query的setCachable (true)方法指明使用二级缓存

例如:session.createQuery("from Category").setCacheable(true).list();

@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")
        .setCacheable(true).list();

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

h)    缓存算法:(纯为了面试)

i.   LRU  LFU  FIFO

    1. Least Recently Used –最近很少被使用
    2. Least Frequently Used (命中率高低)
    3. First In First Out 按顺序替换

ii.   memoryStoreEvictionPolicy = "LRU" (ehcache.xml中配置)

时间: 2024-12-23 21:48:14

Hibernate学习笔记_缓存的相关文章

Hibernate学习笔记--------3.缓存

一.一级缓存 一级缓存又称为“Session缓存”或者“会话级缓存”,通过Session从数据库查询实体时,会把实体在内存中存储起来,下一次查询同一实体时不再再次执行sql语句查询数据库,而是从内存中获取.一级缓存的生命周期和Session相同.一级缓存是无法取消的. 1.一级缓存中的数据可适用范围在当前会话之类,例如用同一个session查询两次user表和同两个session查询俩次user表,查询数据库的次数是不一样的.首先,像这样查询两次,可以看见打印的sql语句只有一次,因为第二次是直

Hibernate学习笔记_查询

HQL vs EJBQL 1         NativeSQL >HQL.> EJBQL(JPQL 1.0) > QBC(Query By Criteria) > QBE(Query By Example)" 2         总结:QL应该和导航关系结合,共同为査询提供服务. @Test public void testHQL_01() { Session session = sf.openSession(); session.beginTransaction();

Hibernate学习笔记_事务

 事务并发处理(面试的意义更大)                        a)   事务:ACID i.   Atomic(原子性) Consistency(一致性) Isolation(隔离性) Durability(独立性) b)   事务并发时可能出现的问题: 第一类丢失更新(Lost Update) 时间 取款事务A 存款事务B T1 开始事务   T2   开始事务 T3 查询账户余额为1000元   T4   查询账户余额为1000元 T5   汇入100元把余额改为1100元

Hibernate学习笔记_联合主键

复合主键(联合主键):多个字段构成唯一性. 一,xml方式 1. 将联合主键的属性提取出来,重新编写一个StudentPK类(原Student类中的id,name要删除 并新加入属性“StudentPK”) //StudentPK .javapackage com.bjsxt.hibernate; public class StudentPK implements java.io.Serializable{ private int id; private String name; public

Hibernate学习笔记_性能优化

注意session.clear()的运用,尤其在不断分页循环的时候 a)    在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象 b)    另外一种形式的内存泄露  (  //面试题:Java有内存泄漏吗?语法级别没有 但是可由java引起,例如:连接池不关闭,或io读取后不关闭) 1+N问题 (典型的面试题)                                              a)    @ManyToOne(fetch=FetchType.LAZY)

hibernate学习笔记_基础配置

一.hibernate.cfg.xml: hbni2ddl.auto 二.搭建日志环境并配置显示DDL语句 我们使用slf接口,然后使用log4j的实现. 1.  首先引入log4j的jar包(log4j-1.2.14.jar), 2.  然后再引入slf4j实现LOG4J和适配器jar包(slf4j-log4j12-1.5.8.jar) 3.  最后创建log4j的配置文件(log4j.properties),并加以修改,只要保留 log4j.logger.org.hibernate.tool

Hibernate学习笔记_关系映射

    一对一关联     一,     一对一单向外键关联 a)    Annotation: 在被约束表字段的get方法上加@0ne20ne @JoinColumn //Husband .java @Entity public class Husband { private int id; private String name; private Wife wife; @Id @GeneratedValue public int getId() { return id; } public S

Hibernate学习笔记_关系映射_其他

集合映射(不太重要) 1         Set 2        List (与Set差不多 多个@OrderBy) a) @OrderBy     排序 private List<User> users = new ArrayList<User>(); @OneToMany(mappedBy="group", cascade={CascadeType.ALL} ) @OrderBy("name ASC") public List<U

Hibernate学习笔记_关系映射_树状结构练习

1         树状结构的设计(至关重要) a) 在同—个类中使用One2Many和Many20ne @Entity public class Org { private int id; private String name; private Set<Org> children=new HashSet<Org>(); private Org parent; @Id @GeneratedValue public int getId() { return id; } public