首页 > 其他分享 >hibernate二级缓存

hibernate二级缓存

时间:2023-08-18 14:36:49浏览次数:39  
标签:缓存 cache list 二级缓存 session user hibernate query


 

(一)什么样的数据适合存放到第二级缓存中?

1 很少被修改的数据

2 不是很重要的数据,允许出现偶尔并发的数据

3 不会被并发访问的数据

4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

(二)不适合存放到第二级缓存的数据?

1 经常被修改的数据

2 财务数据,绝对不允许出现并发

3 与其他应用共享的数据。

在一个数据库系统中,如果缓存设置的合适,那么可以极大的提高系统的效率,Hibernate作为一个ORM工具
提供了缓存的机制,包括一级(Session级)缓存和二级(SessionFactory级)缓存。这里主要总结一下二级缓存。

1.首先需要在hibernate.cfg.xml中配置,当然需要导入缓存的jar包

 

 

 

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

 

如果想缓存使用findall()、list()、Iterator()、createCriteria()、 createQuery()等方法获得的数据结果集。 hibernate.cache.use_query_cache必须配置

 

2.在每个实体的hbm文件中配置cache元素,usage可以是read-only或者是read-write等。

 

<hibernate-mapping package="com.hibernate.model">
	<class name="TUser" table="t_user">
	 	<cache usage="read-write"/>
		<id column="tno" name="tno">
		<!-- 主键生成策略 -->
			<!-- <generator class="assigned" />-->
			<!-- <generator class="sequence">
				 <param name="sequence">seq_tuser_tno</param>
			</generator> -->
			<!-- <generator class="identity" />-->
			<generator class="native" />
		</id>
		<property name="tname" column="tname" type="string" not-null="true"></property>
		<property name="tpwd" column="tpwd" type="string" not-null="true"></property>
	</class>    
</hibernate-mapping>

 

如果相对具体某个类的缓存进行特定的配置,需要在ehcache.xml进行配置:

 

<cache name="com.hibernate.model.TUser"  
         maxElementsInMemory="100"  
         eternal="true"  
        timeToIdleSeconds="0"  
        timeToLiveSeconds="0"  
         overflowToDisk="false"  
         />

 

3.Query或Criteria()时设置其setCacheable(true);

 

public void list(){
      //读取配置文件
        Configuration config = new Configuration().configure();
        //创建sessionFactory对象
        SessionFactory sessionFactory = config.buildSessionFactory();
        //打开session
        Session session = sessionFactory.openSession();
       //开始事务
        Transaction tx = session.beginTransaction();
        //需要antlr.jar包, HQL 到 SQL的转换 
        Query query = session.createQuery("from TUser");
        query.setCacheable(true);
        List<TUser> userList = query.list();
        for(TUser user:userList){
            System.out.println("tno:"+user.getTno()+" tname:"+user.getTname()+" tpwd:"+user.getTpwd());
        }
        //test secondlevel_session,观察是否还会发出sql语句
        List<TUser> list = query.list();
        for(TUser user:list){
            System.out.println("tno:"+user.getTno()+" tname:"+user.getTname()+" tpwd:"+user.getTpwd());
        }
        //关闭session
        session.close();
    }

执行以上代码时,第一次会查询数据库,但是后面就直接从缓存中查询,而不会使用数据库的连接,提高了性能。
    以上任一环节都不能少,比如cache元素没有配置,那么就会导致查询district的时候发起N个数据库的连接,这样会极大的降低性能。

 

标签:缓存,cache,list,二级缓存,session,user,hibernate,query
From: https://blog.51cto.com/u_16229443/7135748

相关文章

  • spring配合hibernate报错:sessionFactory or hibernateTemplate is required
    Causedby:java.lang.IllegalArgumentException:'sessionFactory'or'hibernateTemplate'isrequired atorg.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:118) atorg.springframework.......
  • 关于Mybatis 和 Hibernate 持久层框架之间的区别
    首先,Mybatis和Hibernate都是ORM持久层框架不同点在于,MyBatis是半自动的,它需要开发人员自己手动编写SQL语句。一、MybatisMyBatis支持通过XML或注解的方式来配置需要运行的SQL语句,并且,最终由框架本身将Java对象和SQL语句映射生成最终执行的SQL,执行后,再将结果映射......
  • Hibernate 实体关联关系映射----总结
    http://lavasoft.blog.51cto.com/62575/39398Hibernate实体关联关系映射----总结 花了三天的业余时间,终于写完了Hibernate关联关系映射的所有实例,感觉还应该总结一下。 Hibernate映射关系错综复杂,在实际中真的都能用到吗?不用行吗? 在我......
  • iBATIS、Hibernate和JPA:哪一款最适合你
    在本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persistence API(JPA)。我们介绍每种解决方案并讨论其所规定的品质,以及在广泛的应用场景中其各自的长处和缺点。然后我们会基于诸如性能、移植性、复杂性以及对数据模型改变的适应性等因素来......
  • hibernate 一对一 一对多 多对多
    依赖导入<!--hibernate核心--><dependency><groupId>org.hibernate.orm</groupId><artifactId>hibernate-core</artifactId><version>6.2.7.Final</version></dependency><!--jdbc实现-->&l......
  • hibernate,spring 控制并发访问
    数据库(和其他的事务系统)试图确保事务隔离性(transactionisolation),这意味着,从每个并发事务的观点来看,似乎没有其他的事务在运行。传统上而言,这已经通过锁(locking)实现了。事务可以在数据库中一个特定的数据项目上放置一把锁,暂时防止通过其他事务访问这个项目。一些现代的数据库(如Or......
  • Hibernate基础
     Hibernate基础 Part1      持久化对象Eventevent=newEvent();//populatetheeventSessionsession=factory.openSession();session.save(event);session.flush();session.close();......
  • hibernate入门
    Hibernate是一个开源的ORM(对象关系映射)框架,它可以将Java对象与数据库表进行映射,从而实现面向对象的数据持久化。使用Hibernate,可以避免手动编写SQL语句,从而提高开发效率,并且可以轻松地切换不同的数据库。基础概念entity实体类是映射到数据库表中的Java类,它包含了与数......
  • java mybatis一级缓存二级缓存三级缓存详解
    在MyBatis中,存在一级缓存、二级缓存和三级缓存的概念。下面我将为你详细解释这些缓存的含义和作用:一级缓存:一级缓存是MyBatis默认开启的缓存机制,它是指在同一个SqlSession对象中,执行相同的SQL语句时,会将查询结果缓存到内存中。一级缓存的作用范围仅限于当前的SqlSession,当......
  • Hibernate4的二级缓存
    [color=red][b]Hibernate4.1.4配置二级缓存EHCache步骤[/b][/color][url]http://www.vzhang.net/thread-81-1-1.html[/url]Hibernate4之二级缓存[url]http://zhou137520.iteye.com/blog/1611623[/url]Hibernate4的一些总结[url]http://1194867672-qq-com......