HQL二级存缓

本文介绍了为何需要缓存以提升程序性能,并详细讲解了Ehcache的使用,包括导入依赖、核心接口介绍及ehcache.xml配置。特别强调了eternal、timeToIdleSeconds和timeToLiveSeconds等配置项的作用,以及Hibernate整合Ehcache时的注意事项,特别是它默认只能存储单条记录的缓存,不支持多条记录查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 为什么需要缓存
   拉高程序的性能
   
   
   关系型数据库:数据与数据之间存在关系(联系)的数据库    mysql/Oracle、sqlserver
   非关系型数据库:数据与数据之间是不存在关系的,key-value
        1、基于文件存储的数据库:ehcache
        2、基于内存存储的数据库:redis、memcache
        3、基于文档存储的数据库:mongodb

 

 

2. ehcache的使用
  2.1 导入相关依赖
      <dependency>
          <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.0</version>
      </dependency>

  
  2.2 核心接口
      CacheManager:缓存管理器
      Cache:缓存对象,缓存管理器内可以放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口
      Element:单条缓存数据的组成单位

  2.3 src:ehcache.xml(以及当中的一些元素)

    ①:   eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断

②:timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问

③:timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问

 

注意:①zai pro.xml导入ehcache依赖包的桥接包的版本要与 hibernate的依赖包的版本一致

②hibernate整合ehcache默认存缓单条记录,不能查询多条记录

 

demo:

package com.zking.nine.util;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import java.io.InputStream;

public class EhcacheUtil {

    private static CacheManager cacheManager;

    static {
        try {
        	//建模
            InputStream is = EhcacheUtil.class.getResourceAsStream("/ehcache.xml");
            cacheManager = CacheManager.create(is);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private EhcacheUtil() {
    }

    public static void put(String cacheName, Object key, Object value) {
        Cache cache = cacheManager.getCache(cacheName);
        if (null == cache) {
            //以默认配置添加一个名叫cacheName的Cache
            cacheManager.addCache(cacheName);
            cache = cacheManager.getCache(cacheName);
        }
        cache.put(new Element(key, value));
    }


    public static Object get(String cacheName, Object key) {
        Cache cache = cacheManager.getCache(cacheName);
        Element element = cache.get(key);
        return null == element ? null : element.getValue();
    }

    /**
     * 手动移除缓存中的操作数据
     * @param cacheName
     * @param key
     */
    public static void remove(String cacheName, Object key) {
        Cache cache = cacheManager.getCache(cacheName);
        cache.remove(key);
    }
}

 

package com.zking.nine.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zking.one.entity.User;
import com.zking.two.util.SessionFactoryUtil;

public class EhcacheTest3 {
	/**
	 * hibernate整合ehcache完成查询单个用户
	 * @param args
	 */

	public static void main(String[] args) {
		
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		
		//打印出来只需要查一次
		User user = session.get(User.class, 5);
		System.out.println(user);
		
		User user2 = session.get(User.class, 5);
		System.out.println(user2);
		
		User user3 = session.get(User.class, 5);
		System.out.println(user3);
		
		
		transaction.commit();
		session.close();
		
	}
}

 

package com.zking.nine.test;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;

import com.zking.one.entity.User;
import com.zking.two.util.SessionFactoryUtil;

public class EhcacheTest4 {
	/**
	 * hibernate整合ehcache完成查询多个用户
	 * hibernate整合ehcache默认缓存单条记录,不能缓存多条记录
	 * @param args
	 */

	public static void main(String[] args) {
		
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		
		Query query = session.createQuery("from User");
		//查询带参数
		User user=new User();
		//需要缓存
		user.setUserCache(true);
		
		/*
		 * 使用dao方法的时候,使用ehcache存缓,默认查多条记录是不使用存缓
		 */
	
		if(user.isUserCache()) {
			query.setCacheable(true);
		}
		
		List list = query.list();
		System.out.println(list.size());
		
		List list2 = query.list();
		query.setCacheable(false);
		System.out.println(list2.size());
		
		List list3 = query.list();
		query.setCacheable(true);
		System.out.println(list3.size());
		
		
		
		transaction.commit();
		session.close();
		
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值