SpringCloud整合Oracle据库并集成Mybatis、Ehcache缓存框架

SpringCloud整合Oracle据库并集成Mybatis、Ehcache缓存框架,详细视频教程请关注我。

1、数据库频繁的操作也会影响性能,所以本章节准备给访问数据库前面添加一层缓存操作;

2、虽然说缓存框架存在很多且各有各的优势,本章节仅仅只是为了测试缓存的操作实现,所以就采用了一个简单的缓存框架ehcache;

整合pom.xml配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ppl.springcloud.jdbc</groupId>
  <artifactId>ppl-spring-cloud-jdbc-ehcache</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>ppl-spring-cloud-jdbc-ehcache</name>

	<parent>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-parent</artifactId>
		<version>Dalston.SR5</version>
		<relativePath />
	</parent>

	<dependencies>
	
		<!-- MYSQL数据库依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		
		<!-- Oracle数据依赖 -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0.3</version>
		</dependency>
		
		<!-- SpringMVC依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- Mybatis依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        
        <!-- 开启 cache 缓存 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

        <!-- ehcache 缓存模块 -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>
        
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

YML配置

server:
  port: 8385
spring:
  application:
    name: ppl-spring-cloud-jdbc-ehcache  #全部小写


#######################################
# Oracle 属性配置
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@ip:1521:ssodb
    username: un
    password: pwd


# Mybatis配置
mybatis: 
  config-location: classpath:mybatis/mybatis-cfg.xml        # mybatis配置文件所在路径
  type-aliases-package: com.ppl.cloud.entity                    # 所有Entity别名类所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

############################################
# 打印日志
logging:
  level:
    root: INFO
    org.hibernate: INFO
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE
    org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
    com.ppl: DEBUG

mybatis-cfg.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <settings>
        <setting name="callSettersOnNulls" value="true"/>

        <setting name="cacheEnabled" value="true"/>

        <setting name="lazyLoadingEnabled" value="true"/>

        <setting name="aggressiveLazyLoading" value="true"/>

        <setting name="multipleResultSetsEnabled" value="true"/>

        <setting name="useColumnLabel" value="true"/>

        <setting name="useGeneratedKeys" value="false"/>

        <setting name="autoMappingBehavior" value="PARTIAL"/>

        <setting name="defaultExecutorType" value="SIMPLE"/>

        <setting name="mapUnderscoreToCamelCase" value="true"/>

        <setting name="localCacheScope" value="SESSION"/>

        <setting name="jdbcTypeForNull" value="NULL"/>

    </settings>

    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="String" type="java.lang.String" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />

        <typeAlias alias="User" type="com.ppl.cloud.entity.User"/>
    </typeAliases>

</configuration>

缓存配置类

package com.ppl.cloud.config;

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

/**
 * 缓存配置。
 *
 * @author ljl
 *
 */
@Configuration  
@EnableCaching//标注启动缓存. 
public class CacheConfiguration {
	/** 
     * ehcache 主要的管理器
     *
     * @param bean 
     * @return 
     */  
    @Bean  
    public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
       System.out.println("CacheConfiguration.ehCacheCacheManager()");  
       return new EhCacheCacheManager(bean.getObject());  
    }  
     
    /*
     * 据shared与否的设置,
     * Spring分别通过CacheManager.create()
     * 或new CacheManager()方式来创建一个ehcache基地.
     *
     * 也说是说通过这个来设置cache的基地是这里的Spring独用,还是跟别的(如hibernate的Ehcache共享)
     *
     */
    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
    System.out.println("CacheConfiguration.ehCacheManagerFactoryBean()");
    EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
    cacheManagerFactoryBean.setConfigLocation (new ClassPathResource("ehcache.xml"));
    cacheManagerFactoryBean.setShared(true);
    return cacheManagerFactoryBean;
    }
}

服务接口

package com.ppl.cloud.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.ppl.cloud.entity.User;
import com.ppl.cloud.mapper.IUserMapper;

/**
 * 简单用户链接Mysql数据库微服务(通过@Service注解标注该类为持久化操作对象)。<br/>
 *
 * <li>注意:CACHE_KEY、CACHE_NAME_B 的单引号不能少,否则会报错,被识别是一个对象。</li>
 *
 * <li>value 指的是 ehcache.xml 中的缓存策略空间;key 指的是缓存的标识</li>
 *
 * @author ljl
 *
 */
@Service
public class UserService {


    private static final String CACHE_KEY = "'user'";
    private static final String CACHE_NAME_B = "cache-b";

    //* @Cacheable : Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,
    //* 而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
    //* @CacheEvict : 清除缓存。
    //* @CachePut : @CachePut也可以声明一个方法支持缓存功能。
    //* 使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,
    //* 而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。


    @Autowired
    IUserMapper iUserMapper;


    /**
     * 查找用户数据
     *
     * @param id
     * @return
     */
    @Cacheable(value=CACHE_NAME_B, key="'user_'+#id")
    public User findUserById(String id) {
        return iUserMapper.findUserById(id);
    }
    
    /**
     * 保存用户数据
     *
     * @param user
     * @return
     */
    @CacheEvict(value=CACHE_NAME_B, key=CACHE_KEY)
    public int insertUser(User user) {
        return iUserMapper.insertUser(user);
    }
    

    /**
     * 更新用户数据
     *
     * @param user
     * @return
     */
    @CachePut(value = CACHE_NAME_B, key = "'user_'+#user.id")
    public int updateUser(User user) {
        return iUserMapper.updateUser(user);
    }

    /**
     * 删除用户数据
     *
     * @param id
     * @return
     */
    @CacheEvict(value = CACHE_NAME_B, key = "'user_' + #id") //这是清除缓存
    public int deleteUser(String id) {
        return iUserMapper.deleteUser(id);
    }
    
}

Controller类

package com.ppl.cloud.controller;

import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.ppl.cloud.entity.User;
import com.ppl.cloud.service.UserService;

@RestController
public class EhCacheController {

	private static Logger logger = Logger.getLogger(EhCacheController.class);
    @Autowired
    private UserService userService;
    
    @GetMapping("/user/{id}")
    public User findUserById(@PathVariable String id) {
    	
        //第一次查询
    	logger.info("===========  第一次查询");
    	logger.info("===========  第一次查询结果: {}"+userService.findUserById(id).toString());
        //通过缓存查询
    	logger.info("===========  通过缓存第 1 次查询");
    	logger.info("===========  通过缓存第 1 次查询结果: {}"+userService.findUserById(id).toString());
    	logger.info("===========  通过缓存第 2 次查询");
    	logger.info("===========  通过缓存第 2 次查询结果: {}"+userService.findUserById(id).toString());
    	logger.info("===========  通过缓存第 3 次查询");
    	logger.info("===========  通过缓存第 3 次查询结果: {}"+userService.findUserById(id).toString());
        
        return this.userService.findUserById(id);
    }
    
}

欢迎关注索取更多教程:


猜你喜欢

转载自blog.csdn.net/cadn_jueying/article/details/80750720