hibernate的缓存技术使用

缓存技术

1 引入包,

 1 <!-- 二级缓存ehcache -->
 2         <!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
 3         <dependency>
 4             <groupId>net.sf.ehcache</groupId>
 5             <artifactId>ehcache</artifactId>
 6             <version>2.10.1</version>
 7         </dependency>
 8         <!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-web -->
 9         <dependency>
10             <groupId>net.sf.ehcache</groupId>
11             <artifactId>ehcache-web</artifactId>
12             <version>2.0.4</version>
13         </dependency>
14     

注意版本的统一

2 配置hibernate方言为其开启二级缓存,

1 hibernate.cache.use_second_level_cache=${hibernate.use_second_level_cache}
2                 hibernate.cache.use_query_cache=${hibernate.use_query_cache}
3                 hibernate.cache.provider_class=${hibernate.provider_class}
4                 hibernate.cache.provider_configuration_file_resource_path=${hibernate.provider_configuration_file_resource_path}

再次查询的时候如后没有sql打印一定要检查一下我们的日志是否是配置了sql的打印

还有那个缓存插件我们可以使用OSCache和ehcache等等hibernate默认使用的是ehcache

3 写缓存文件

 1 <?xml version="1.0" encoding="UTF-8"?>  
 2 <ehcache>  
 3   <!--如果缓存中的对象存储超过指定的缓存数量的对象存储的磁盘地址-->  
 4   <diskStore path="E:/ehcache"/>  
 5   
 6    <!-- 指定区域cache:通过name指定,name对应到Hibernate中的区域名即可-->
 7    <cache name="SimplePageCachingFilter"  
 8         maxElementsInMemory="10000"  
 9         maxElementsOnDisk="1000"  
10         eternal="false"  
11         overflowToDisk="true"  
12         timeToIdleSeconds="5"  
13         timeToLiveSeconds="30"  
14         memoryStoreEvictionPolicy="LFU"/>
15          
16   <!-- 默认cache:如果没有对应的特定区域的缓存,就使用默认缓存 -->
17   <!-- Ehcache 对象、数据缓存用以下配置 -->
18   <defaultCache  maxElementsInMemory="10000"
19         eternal="false" 
20         timeToIdleSeconds="120"
21         timeToLiveSeconds="120"
22         overflowToDisk="true"
23         diskSpoolBufferSizeMB="30" 
24         maxElementsOnDisk="10000000" 
25         diskPersistent="false" 
26         diskExpiryThreadIntervalSeconds="120"/>
27   
28 </ehcache>  
29 <!--
30    name:缓存名称。
31    maxElementsInMemory:缓存最大个数。
32    eternal:对象是否永久有效,一但设置了,timeout将不起作用。
33    timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
34    timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
35    overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
36    diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
37    maxElementsOnDisk:硬盘最大缓存个数。
38    diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
39    diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
40    memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
41    clearOnFlush:内存数量最大时是否清除。 
42   -->

下面是测试代码

package com.cache;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.cache.entity.Permission;
import com.cache.entity.UserInfo;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring.xml", "classpath:spring-hibernate.xml"})
public class TestEvent {

    /**
     * 为什么在每次测试的时候都会去执行查询语句,是应为每次都加在了配置文件,那么就相当于每次都从新启动了服务
     */
    @Autowired
    HibernateTemplate hibernateTemplate;

    @Autowired
    JdbcTemplate jdbcTemplate;

    public void testinsert() {
        // UserInfo userInfo = new UserInfo();
        // userInfo.setUserInfo_name("李四");
        // this.hibernateTemplate.save(userInfo);
        this.hibernateTemplate.setCacheQueries(true);
        /*
         * 设置缓存区域的名称查询执行的这个模板。 如果这是指定的,它将适用于所有查询和标准创建的对象这个模板(包括所有查询通过查找方法)。
         * 的缓存区域不会生效,除非这个模板创建的查询缓存配置通过“cacheQueries”属性
         */
        // 设置缓存使用那个区域,如果设置这个属性那么一定要有setCacheQueries(true);
        // this.hibernateTemplate.setQueryCacheRegion("");
        List<UserInfo> userInfos = (List<UserInfo>) this.hibernateTemplate.find("from UserInfo");
        for (UserInfo userInfo2 : userInfos) {
            System.out.println(userInfo2.getUserInfo_name());
        }

        List<UserInfo> userInfos1 = (List<UserInfo>) this.hibernateTemplate.find("from UserInfo");
        for (UserInfo userInfo2 : userInfos1) {
            System.out.println(userInfo2.getUserInfo_name());
        }
    }

    public void testselect() {
        // Permission permission = new Permission();
        // permission.setPermission_name("admin");
        // this.hibernateTemplate.save(permission);
        List<Permission> permissions = (List<Permission>) this.hibernateTemplate.find("from Permission");
        for (Permission permissionlist : permissions) {
            System.out.println(permissionlist.getPermission_name());
        }

        List<Permission> permissions1 = (List<Permission>) this.hibernateTemplate.find("from Permission");
        for (Permission permissionlist : permissions1) {
            System.out.println(permissionlist.getPermission_name());
        }
    }

    public void testUserPage() {

        List<UserInfo> userInfos = this.hibernateTemplate.findByExample(new UserInfo(), 0, Integer.MAX_VALUE);
        for (UserInfo userInfo : userInfos) {
            System.out.println("id---->" + userInfo.getUserInfo_id());
            System.out.println("userNmae ---->" + userInfo.getUserInfo_name());

        }

    }

    /**
     * jdbcTemplate指定查询字段测试成功
     */
    public void testjdbcSelect() {
        String uuid = UUID.randomUUID().toString();
        this.jdbcTemplate.update("insert into userinfo (userinfo_id,userinfo_name) values (?,?)",
                new Object[] { uuid, "王立虎" });
        List<Map<String, Object>> userInfos = this.jdbcTemplate
                .queryForList("select userinfo_id,userinfo_name from UserInfo");
        for (Map<String, Object> userInfo : userInfos) {
            System.out.println(userInfo.get("userinfo_id"));
            System.out.println(userInfo.get("userinfo_name"));
        }

    }

    @Test
    public void testhibernateSelect() {
        @SuppressWarnings("unchecked")
        List<Object[]> userInfos =(List<Object[]>) this.hibernateTemplate.find("select u.userInfo_id,u.userInfo_name from UserInfo u");
        for (Object[] obj : userInfos) {
            System.out.println(obj[1]);
        }

    }

}

以及日志的配置

log4j.rootLogger=INFO,Console,File
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#log4j.appender.Console.layout = org.apache.log4j.SimpleLayout
log4j.appender.File = org.apache.log4j.RollingFileAppender
log4j.appender.File.File = logs/ssm.log
log4j.appender.File.MaxFileSize = 10MB
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
#this is the most important config for showing parames like ?  
log4j.logger.org.hibernate.SQL=trace   
#log4j.logger.org.hibernate.type=trace  
#above two configs   
#log4j.logger.org.hibernate.tool.hbm2ddl=debug   
#log4j.logger.org.hibernate.hql=debug   
#log4j.logger.org.hibernate.cache=debug  
#log4j.logger.org.hibernate.transaction=debug   
#log4j.logger.org.hibernate.jdbc=debug   
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace  

 

posted @ 2016-08-28 18:12 奋斗,坚持 阅读(...) 评论(...)  编辑 收藏