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);
}
}
欢迎关注索取更多教程: