Hibernate-二级缓存

来源:互联网 发布:单恋东野圭吾知乎 编辑:程序博客网 时间:2024/05/04 12:36

hibernate.cfg.xml中

<?XML版本= '1 .0'编码=“UTF-8”?><!DOCTYPE hibernate的配置公开        “ -  / /休眠/ Hibernate配置DTD 3.0 / / EN”        “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”><hibernate-configuration>< - !是用来描述数据库的连接 - >的<session-factory><! -  驱动- ><property name="connection.driver_class">com.mysql.jdbc.Driver</财产><! -  网址- ><property name="connection.url">为jdbc:mysql的:/ /本地主机:3306/hibernate0909</财产><! -  用户名- ><property name="connection.username">根</财产><! -  密码- ><property name="connection.password"> </财产><! -  休眠针对建表的操作更新如果有表,检查表的结构,如果没有则创建创建拖放启动休眠创建表,结束休眠删除表创建每次启动都重新创建表验证每次启动都检查表的结构- ><! -  二级缓存的提供商- ><property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</财产><! -  开启二级缓存- ><property name="cache.use_second_level_cache">真</财产><property name="hbm2ddl.auto">更新</财产><property name="show_sql">真</财产><property name="current_session_context_class">线</财产><! -  开启查询缓存 - ><property name="cache.use_query_cache">真</财产><映射资源=“cn/itcast/hibernate0909/sessionfactory/cache/Classes.hbm.xml”/><映射资源=“cn/itcast/hibernate0909/sessionfactory/cache/Student.hbm.xml”/><! - <class-cache usage="read-only" class=""/>- ></会话工厂></ hibernate的配置>

Classes.hbm.xml

<?XML版本=“1.0”编码=“UTF-8”?>!<DOCTYPE注意hibernate-mapping PUBLIC“ -  / /休眠/ Hibernate映射DTD 3.0 / / EN”“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”><! -      通过MyEclipse的持久性工具自动生成的映射文件- ><hibernate-mapping>    <class name="cn.itcast.hibernate0909.onetomany.doubl.Classes">    <cache usage="read-write"/> < - !为班级开启二级缓存 - >    <id name="cid" type="java.lang.Long" length="5">    <column name="cid"> </列>    <generator class="increment"> </发电机>    </ ID>        <property name="cname" type="java.lang.String" length="20"> </财产>    <property name="d​​escription" type="java.lang.String" length="100"> </财产>    <! -      级联指的是对象对对象的操作    逆指的是对象对关系的操作     - >    <set name="students" cascade="all" inverse="false" lazy="extra">    的<key>    <! -      通过班级建立与学生之间的联系     - >    <column name="cid"> </列>    </键>    <one-to-many class="cn.itcast.hibernate0909.onetomany.doubl.Student"/>    </套>    </班></ hibernate的映射>

Student.hbm.xml

<?XML版本=“1.0”编码=“UTF-8”?>!<DOCTYPE注意hibernate-mapping PUBLIC“ -  / /休眠/ Hibernate映射DTD 3.0 / / EN”“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”><! -      通过MyEclipse的持久性工具自动生成的映射文件- ><hibernate-mapping>    <class name="cn.itcast.hibernate0909.onetomany.doubl.Student">    <id name="sid" type="java.lang.Long" length="5">    <column name="sid"> </列>    <generator class="increment"> </发电机>    </ ID>        <property name="sname" type="java.lang.String" length="20"> </财产>    <property name="d​​escription" type="java.lang.String" length="100"> </财产>    <! -      多对一       注意:在许多对一中没有逆属性         对学生表的修改本身就是维护外键     - >    <many-to-one name="classes" class="cn.itcast.hibernate0909.onetomany.doubl.Classes" cascade="all">    <! -      外键       描述了通过学生建立与类之间的联系     - >    <column name="cid"> </列>    </多对一一>    </班></ hibernate的映射>

ehcache.xml中

<的Ehcache的xmlns:XSI =“htt​​p://www.w3.org/2001/XMLSchema-instance”          XSI:“。。/配置/ ehcache.xsd”noNamespaceSchemaLocation =>             <diskStore path="C:\\TEMP1"/>    <defaultCache            maxElementsInMemory =“12”            永恒=“假”            timeToIdleSeconds =“120”            timeToLiveSeconds =“120”            overflowToDisk =“假”            maxElementsOnDisk =“10000000”            diskPersistent =“假”            diskExpiryThreadIntervalSeconds =“120”            memoryStoreEvictionPolicy =“LRU”            />               <高速缓存            NAME =“cn.itcast.hibernate0909.onetomany.doubl.Classes”            maxElementsInMemory =“10”             永恒=“假”            timeToIdleSeconds =“120”            timeToLiveSeconds =“120”            overflowToDisk =“真”            maxElementsOnDisk =“10000000”            diskPersistent =“假”            diskExpiryThreadIntervalSeconds =“120”            memoryStoreEvictionPolicy =“LRU”            /></ ehcache的>

/ ** *二级缓存 *二级缓存是一个共享缓存 *在二级缓存中存放的数据是共享数据 *特性 *修改不能特别频繁 *数据可以公开 **二级缓存在sessionFactory中,因为sessionFactory本身是线程安全,所以二级缓存的数据线程也是安全的 *二级缓存的生命周期和SessionFactory的一样 **怎么样把数据放入到二级缓存中 *通过session.get,session.load,session.update方法都可以把对象放入到二级缓存中 **怎么样把数据从二级缓存中提取 *通过session.get和session.load方法都可以提取二级缓存中的数据 ** ..... *配置二级缓存 *在休眠的配置文件中 * <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</财产><property name="cache.use_second_level_cache">真</财产>     *在classes.hbm.xml文件中            <cache usage="read-write"/>     *把二级缓存中的数据放到磁盘上        *在类路径下存放一个文件ehcache.xml中              <高速缓存            NAME =“cn.itcast.hibernate0909.onetomany.doubl.Classes”            maxElementsInMemory =“10”             永恒=“假”            timeToIdleSeconds =“120”            timeToLiveSeconds =“120”            overflowToDisk =“真”            maxElementsOnDisk =“10000000”            diskPersistent =“假”            diskExpiryThreadIntervalSeconds =“120”            memoryStoreEvictionPolicy =“LRU”            />        *当内存中的二级缓存存放够5个对象时,剩余的对象就放入到磁盘上  * @作者管理员 * * /公共类TwoCacheTest {私有静态的SessionFactory SessionFactory的;静态{配置配置=新配置();/ /加载配置文件configuration.configure(“cn/itcast/hibernate0909/sessionfactory/cache/hibernate.cfg.xml”);/ /采用了工厂模式创建SessionFactory的SessionFactory的= configuration.buildSessionFactory();}/ ** * session.get *把一个对象变成持久化状态的对象 *把该对象存到会话的一级缓存中 *把该对象存到二级缓存中 * session.clear清空一级和二级缓存 * /@测试公共无效testGet(){会话会话= sessionFactory.openSession();班班=(类)session.get(Classes.class,1L);session.close();会话= sessionFactory.openSession();类=(类)session.get(Classes.class,1L);System.out.println(classes.getCname());session.close();}/ ** *同上 * /@测试公共无效testLoad(){会话会话= sessionFactory.openSession();班班=(类)session.load(Classes.class,1L);classes.getCname();session.close();会话= sessionFactory.openSession();类=(类)session.get(Classes.class,1L);System.out.println(classes.getCname());session.close();}/ ** * session.update * session.update也要进入二级缓存 * /@测试公共无效testUpdate(){会话会话= sessionFactory.openSession();班班=(类)session.get(Classes.class,1L);session.clear();session.update(类);session.close();会话= sessionFactory.openSession();类=(类)session.get(Classes.class,1L);session.close();}/ ** *的session.save *该方法只把对象放入到了一级缓存中,没有放入到二级缓存中 *在执行session.flush的时候,把数据要保存到二级缓存中 * /@测试公共无效testSave(){会话会话= sessionFactory.openSession();交易交易= session.beginTransaction();班班=新类();classes.setCname(“0909java极品班”);classes.setDescription(“都是极品”);的session.save(类);/ /器transaction.commit();/ / session.flush();session.close();会话= sessionFactory.openSession();类=(类)session.get(Classes.class,classes.getCid());器transaction.commit();session.close();}/ ** *把溢出的数据存放到磁盘上 * /@测试公共无效testBatchSave()抛出异常{会话会话= sessionFactory.openSession();交易交易= session.beginTransaction();为(int i = 1; I <12; i + +){班班=新类();classes.setCname(“0909java极品班”+ I);classes.setDescription(“都是极品”+ I);的session.save(类);}器transaction.commit();视频下载(1000);session.close();}/ ** *查询缓存 *查询缓存是建立在二级缓存基础之上的 *查询缓存不是默认开启的,需要设置 * <property name="cache.use_query_cache">真</财产> *在代码中进行设置 * query.setCacheable(真); * /@测试公共无效testQuery(){会话会话= sessionFactory.openSession();查询查询= session.createQuery(“从类”);query.setCacheable(真);列表<Classes> classesList = query.list();查询= session.createQuery(“从类”);query.setCacheable(真);classesList = query.list();session.close();}/ ** * session.createQuery(“从类”)列表(); * session.createQuery(“从类”)迭代(); *这两者有什么区别 **发出SQL语句的不同 *利用缓存的不同 *     * query.setFirstResult(4);   query.setMaxResults(5);      这两个方法就是休眠的分页   *  * /}

Hibernate iterate和list方法的区别

String hql = "from Student";
  Query query = session.createQuery(hql);

 

对于这条语句的查询:

 

List<Student> stus = query.list();

会把所有的查询结果放到list中。一次加载到内存。

语句:select student0_.id as id3_, student0_.studentage as studentage3_, student0_.studentname as studentn3_3_ from Student student0_//当执行list方法的时候

 

Iterator<Student> stus = query.iterate();

该语句只把ID的值放到迭代器中,当遍历的时候,会根据ID的值再去数据库中查。并且该语句会产生N+1次查询。

语句1:select student0_.id as col_0_0_ from Student student0_  //当执行iterate方法的时候

语句2:select student0_.id as id3_0_, student0_.studentage as studentage3_0_, student0_.studentname as studentn3_3_0_ from Student student0_ where student0_.id=?//遍历获取值的时候

 

这两个方法各有千秋。请根据具体情况选择使用(牺牲内存或者牺牲网络资源)。



0 0
原创粉丝点击