1. 程式人生 > >springboot-cache自定義快取載入資料字典表

springboot-cache自定義快取載入資料字典表

專案需求:

專案資料儲存在hbase中,每次查詢資料都需將一些資料進行轉換,對於大資料查詢操作頻繁連線資料庫獲取字典值,這會影響整個查詢速度。

解決方案:

1、根據不同業務模組劃分,專案中對於資料流處理(單獨spark服務),通過redis快取字典資料。

2、前段需要用到字典資料,將資料快取到.net端。

3、web端java服務,考慮到redis還需要安裝,運維維護不變,開發人員使用也不方便,並切需要定時操作資料庫快取到redis,所以在服務端自定義快取處理,通過定時器間隔一定時間,將資料寫入到快取中。

具體實現如下:

專案結構如下


在pom.xml中引入依賴包

<?xml version="1.0" encoding
="UTF-8"?> <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.example.springboot</groupId
> <artifactId>springboot-cache2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-cache2</name> <description>Demo project for Spring Boot</description> <parent> <
groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 引入sqlserver資料連線包 <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <scope>runtime</scope> </dependency> --> <!-- 引入mybatis 資料庫操作包 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 引入mybatis 分頁外掛 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.0</version> </dependency> <!-- 任務排程 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <!-- beanutils實體類處理 --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency> <!-- 公共處理類 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <!-- log4j日誌記錄--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/dom4j/dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.4</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

在application.properties中新增資料連線

#server.port=8090
#標示使用的是mysql/oracle/sqlserver
datasource.type=mysql
#mysql資料連線
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
#spring.datasource.max-active=20
#spring.datasource.max-idle=8
#spring.datasource.min-idle=8
#spring.datasource.initial-size=20
#mybatis 配置
# 配置對映檔案載入
mybatis.mapper-locations=classpath*:mapper/*.xml
# 實體類通過別名使用
#mybatis.type-aliases-package=
#springmvc檢視
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
#單個檔案上傳限制
spring.http.multipart.maxFileSize=10Mb
#單次檔案上傳限制
spring.http.multipart.maxRequestSize=100Mb

constant類:

package com.example.springboot.cache.constant;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Constants {
   private static final Log log = LogFactory.getLog(Constants.class);
   public static String CacheXml = "cacheManage.xml";

   /**
    * 配置xml檔案路勁
    */
public static String cacheXmlPath = null;

   static {
      if (null == Constants.class.getClassLoader().getResource("/")) {
         cacheXmlPath = Constants.class.getClassLoader().getResource("").getPath() + CacheXml;
      } else {
         cacheXmlPath = Constants.class.getClassLoader().getResource("/").getPath() + CacheXml;
      }
      if (cacheXmlPath != null && !"".equals(cacheXmlPath)) {
         String os = System.getProperty("os.name");
         if (os.toLowerCase().startsWith("win") && cacheXmlPath.startsWith("/")) {
            cacheXmlPath = cacheXmlPath.substring(1);
         }
      }
      log.info("cacheXmlPath " + cacheXmlPath);
   }
}

建立dao操作資料庫類

package com.example.springboot.cache.dao;

import com.example.springboot.cache.entity.dto.CacheEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;

/**
 * @desc 查詢資料字典
 * @Author wangsh
 * @date 2018/5/6 18:10
 * @return
*/
@Mapper
public interface CacheManagerMapper {

   public List<Map<String, Object>> getDataFromDBSaveToTempCache(CacheEntity dto);

}

mapper配置檔案

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.springboot.cache.dao.CacheManagerMapper">
    <!-- 查詢字典表資料 -->
<select id="getDataFromDBSaveToTempCache" parameterType="com.example.springboot.cache.entity.dto.CacheEntity"
resultType="java.util.Map">
        /*SELECT ${columns} FROM ${dbName}.${table} as rs WITH(NOLOCK) WHERE 1=1*/
        select * from test.sc_dict_sex where 1=1
        <if test="null != conditions and '' != conditions">
            AND ${conditions}
        </if>
    </select>
</mapper>

建立實體類

package com.example.springboot.cache.entity.dto;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @desc 快取實體類
 * @Author wangsh
 * @date 2018/5/6 18:11
 * @return
*/
public class CacheEntity {
   //資料庫名稱
private String dbName;
   //例項名
private String dbo;
   //表名
private String table;
   //資料庫型別
private String datasourceType;
   //列名稱(多個以逗號分割)
private String columns;
   //查詢條件
private String conditions;
   private String key;
   // 是否快取
private String fullCache;
   private String toMapField;
   private Map<String, Map<String, Object>> cacheMapData;
   private List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

   public String getDbName() {
      return dbName;
   }

   public void setDbName(String dbName) {
      this.dbName = dbName;
   }

   public String getDbo() {
      return dbo;
   }

   public void setDbo(String dbo) {
      this.dbo = dbo;
   }

   public String getTable() {
      return table;
   }

   public void setTable(String table) {
      this.table = table;
   }

   public String getKey() {
      return key;
   }

   public void setKey(String key) {
      this.key = key;
   }

   /**
    * 獲取list
    *
    * @return list list
    */
public List<Map<String, Object>> getList() {
      return list;
   }

   /**
    * 設定list
    *
    * @param list list
    */
public void setList(List<Map<String, Object>> list) {
      this.list = list;
   }

   /**
    * 獲取columns
    *
    * @return columns columns
    */
public String getColumns() {
      return columns;
   }

   /**
    * 設定columns
    *
    * @param columns columns
    */
public void setColumns(String columns) {
      this.columns = columns;
   }

   /**
    * 獲取conditions
    *
    * @return conditions conditions
    */
public String getConditions() {
      return conditions;
   }

   /**
    * 設定conditions
    *
    * @param conditions conditions
    */
public void setConditions(String conditions) {
      this.conditions = conditions;
   }

   /**
    * 獲取toMapField
    *
    * @return toMapField toMapField
    */
public String getToMapField() {
      return toMapField;
   }

   /**
    * 設定toMapField
    *
    * @param toMapField toMapField
    */
public void setToMapField(String toMapField) {
      this.toMapField = toMapField;
   }

   /**
    * 獲取cacheMapData
    *
    * @return cacheMapData cacheMapData
    */
public Map<String, Map<String, Object>> getCacheMapData() {
      return cacheMapData;
   }

   /**
    * 設定cacheMapData
    *
    * @param cacheMapData cacheMapData
    */
public void setCacheMapData(Map<String, Map<String, Object>> cacheMapData) {
      this.cacheMapData = cacheMapData;
   }

   /**
    * 獲取fullCache
    *
    * @return fullCache fullCache
    */
public String getFullCache() {
      return fullCache;
   }

   /**
    * 設定fullCache
    *
    * @param fullCache fullCache
    */
public void setFullCache(String fullCache) {
      this.fullCache = fullCache;
   }

   public String getDatasourceType() {
      return datasourceType;
   }

   public void setDatasourceType(String datasourceType) {
      this.datasourceType = datasourceType;
   }

   @Override
public String toString() {
      return "CacheEntity{" +
            "dbName='" + dbName + '\'' +
            ", dbo='" + dbo + '\'' +
            ", table='" + table + '\'' +
            ", datasourceType='" + datasourceType + '\'' +
            ", columns='" + columns + '\'' +
            ", conditions='" + conditions + '\'' +
            ", key='" + key + '\'' +
            ", fullCache='" + fullCache + '\'' +
            ", toMapField='" + toMapField + '\'' +
            ", cacheMapData=" + cacheMapData +
            ", list=" + list +
            '}';
   }
}

service層業務處理類

package com.example.springboot.cache.service;

import com.example.springboot.cache.entity.dto.CacheEntity;
import java.util.concurrent.ConcurrentMap;

/**
 * @desc 快取處理類
 * @Author wangsh
 * @date 2018/5/6 18:06
 * @return
*/
public interface PullDataToCache {
   public void pullData(ConcurrentMap<String, CacheEntity> cache);

   public void refreshCacheData(ConcurrentMap<String, CacheEntity> cache);
}

service實現類

package com.example.springboot.cache.service.impl;

import com.example.springboot.cache.constant.Constants;
import com.example.springboot.cache.dao.CacheManagerMapper;
import com.example.springboot.cache.entity.dto.CacheEntity;
import com.example.springboot.cache.service.PullDataToCache;
import com.example.springboot.cache.util.XmlUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;

/**
 * @desc 快取處理類
 * @Author wangsh
 * @date 2018/5/6 18:07
 * @return
*/
@Service
public class PullDataToCacheImpl implements PullDataToCache {
   private static final Log log = LogFactory.getLog(PullDataToCacheImpl.class);

   @Value("${datasource.type}")
   private String datasourceType;

   @Autowired
private CacheManagerMapper mapper;

   private static List<CacheEntity> cacheTableInfoList = new ArrayList<CacheEntity>();

   @Override
public void pullData(ConcurrentMap<String, CacheEntity> cache) {
      log.info("快取管理-->服務啟動:新增快取入口開啟呼叫!");
      try {
         // 解析xml檔案,並將要快取的表資訊儲存入cacheTableInfoList;
parseCacheXml();
         // 從資料庫獲取資料,並儲存資料
getDataFromDBSaveToTempCache();
         // 放入快取中
SaveToCacheManager(cache);
      } catch (Exception e) {
         log.error("快取管理-->服務啟動:快取添加出現異常", e);
      }
      log.info("快取管理-->服務啟動:新增快取入口呼叫完成!");
   }

   private void SaveToCacheManager(ConcurrentMap<String, CacheEntity> cache) {
      for (CacheEntity ce : 
            
           

相關推薦

springboot-cache定義快取載入資料字典

專案需求:專案資料儲存在hbase中,每次查詢資料都需將一些資料進行轉換,對於大資料查詢操作頻繁連線資料庫獲取字典值,這會影響整個查詢速度。解決方案:1、根據不同業務模組劃分,專案中對於資料流處理(單獨spark服務),通過redis快取字典資料。2、前段需要用到字典資料,將

springboot-cache3定義快取載入資料庫屬性配置

需求:由於專案中配置項太多,配置檔案維護很不方便,將配置項放在資料庫中維護,通過專案啟動時將資料庫配置載入到環境變數中,其他需要使用的業務直接使用引用的方式是@Value("${欄位}")專案結構:pom.xml引入依賴包<?xml version="1.0" enco

oracle定義函式查詢資料字典

 /****************************** 假設儲存資料字典表名:data_dict_entry  表結構如下: create table data_dict_entry  (   DICTTYPEID VARCHAR2(128) not null,

使用ajax載入資料字典載入到頁面下拉選框

資料字典表 base_dict ![資料字典表結構](https://img-blog.csdn.net/20180930102414188?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDA5OD

(springboot)基於Redis實現Mybatis二級快取(定義快取)

Springboot + Mybatis + Redis Mybatis的二級快取是多個SqlSession共享的,作用於是mapper配置檔案中同一個namespace,不同的SqlSession兩次執行相同namespace下的sql語句且引數如果也一樣則最終執行的sq

Springboot 2.x Redis Cache 定義key value序列化方式

Redis習慣使用 Json格式來儲存了,spring-data-redis 2.0 開始網上找的方法已經都不適用了,文件裡也沒說清楚,通過分析原始碼最後解決。 這裡簡單介紹一下我的解決方法 1、pom依賴 <dependency> <gr

springboot ehcache快取使用及定義快取存取

新增依賴 首先在pom.xml新增必要依賴 <dependency> <groupId>org.springframework.boot</groupId>

SpringBoot 基礎系列】實現一個定義配置載入器(應用篇)

![](https://spring.hhui.top/spring-blog/imgs/200507/logo.jpg) > [【SpringBoot 基礎系列】實現一個自定義配置載入器(應用篇)](https://mp.weixin.qq.com/s?__biz=MzU3MTAzNTMzMQ==&

Springboot定義配置文件及讀取配置文件

ebo hello path host 目錄 tps pre 示例 control 本文章來自【知識林】 讀取核心配置文件 核心配置文件是指在resources根目錄下的application.properties或application.yml配置文件,讀取這兩個配置文件

springboot(八)定義Filter

frame ide inf 執行權 tps pattern n) filters nts 自定義Filter   我們常常在項目中會使用filters用於錄調用日誌、排除有XSS威脅的字符、執行權限驗證等等。   Spring Boot自動添加了OrderedChara

SpringBoot定義查詢Query

pan inter 自定義 gif pat urn package random 分享 下面講解下SpringBoot之自定義查詢Query的實例 SpringBoot之自定義查詢Query有HQL語句查詢(Hibernate),還可以采用sql語句本地查詢 Book

springboot mybatis定義枚舉enum轉換

ger str string類型 配置 tex except package figure type 原文鏈接:https://blog.csdn.net/u014527058/article/details/62883573 一、概述 在利用Spring進行Web後臺

cas+shiro+springboot+pac4j 定義登陸介面以及驗證碼等

首先 我把主要參考的文章貼出來: https://blog.csdn.net/weixin_39819191/article/details/80361301 https://blog.csdn.net/u010588262/article/category/7548325  

springboot定義屬性以及亂碼三

自定義屬性的使用(讀取配置檔案,在專案啟動的時候根據@Value去配置檔案中獲取屬性) 在建好的springboot專案properties屬性中自定義屬性,如下: 通過@Value獲取自定義屬性 @Value("${name}") 啟動專案:

springboot定義過濾器

1.public class Logfilter implements Filter{ private Logger logger= LoggerFactory.getLogger(Logfilter.class); @Override public void init(FilterCo

如何定義日誌採集資料?資料來源都包含哪些方面?

資料來源主要包括兩方面:內部資料,外部資料 日誌採集的資料主要分為以下幾方面: 1.埋點資料:在頁面放置一段js程式碼,使用者的行為觸發程式碼之後會自動載入一些資料,並通過建立script標籤的形式src載入外部的一段js採集程式碼; 2.採集之後傳到後臺,因為是分散式,js程式碼跟後臺

關於springboot讀取定義的配置

我是自定義一個關於發郵件的自定義檔案,然後讀取它,在網上找了很多關於讀取檔案的,結果一直髮現值為null,用@Value讀取也為null,因為我不是在controller層讀取配置,而是在util工具包讀取,就十分麻煩, 記錄下來自己走過的坑: 第一步不用說,建立配置檔案; 第二步,建立

Java類載入器( CLassLoader ) 死磕7: 基於加密的定義網路載入器 本小節目錄

【正文】Java類載入器(  CLassLoader ) 死磕7:  基於加密的自定義網路載入器 本小節目錄 7.1. 加密傳輸Server端的原始碼 7.2. 加密傳輸Client端的原始碼 7.3. 使用亦或實現簡單加密和解密演算法 7. 網路加密SafeClassLoader的原

定義 Dialog 載入進度,去除定義Dialog的白色背景

去除自定義Dialog的白色背景: mDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); 這句話就可以了,一定要記得 在show()前加; 下面附上完整程式碼: public c

java類載入機制和定義載入

類載入順序 上圖所示的是類載入的順序,按照大的順序可以分為載入、連結、初始化 其中連結又可以分成驗證、準備、解析三個步驟 載入 1.將類的class檔案讀入到記憶體中 載入類檔案的方式有: 1. 本機檔案載入 2.jar包載入 3.網路載入 4.原始檔動態編譯載入