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.原始檔動態編譯載入