關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle、ElasticSearch欄位摺疊查詢)
關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle)
最近做專案遇到了一個很麻煩的需求,欄位摺疊,使用mysql查詢的話,簡化一下sql語句是這樣的,我在專案中的查詢涉及兩張表並且有多項不定項的查詢條件,也就是需要sql拼接;
select * from 表 group by 欄位 limit i, j;
這樣確實能夠解決問題,但是由於有很多條件查詢,會使索引失效,導致速度極慢,所以我們考慮使用elasticsearch進行資料查詢,那麼問題來了,springboot1.5版本所支援的elasticsearch最高版本為2.4,而這樣的sql語句查詢elasticsearch需要到5版本以上才能夠支援查詢,這就涉及了elasticsearch的升級;在這裡提供一篇非常好的部落格,很好的講解了什麼是欄位摺疊,本人十分感謝這篇文章!
升級ElasticSearch
springboot1.5版本支援的elasticsearch版本為2.4.0;而elasticsearch欄位摺疊需要在5版本以後才能夠使用,所以我們要升級elasticsearch到5版本,如果我們不升級springboot,引用elasticsearch5的相關jar包,其實也可以做到資料互動,但是我們無法使用jpa進行資料互動,在實際專案中,這是很可怕的事情,因為你的改動會大的離譜;
那怎麼辦? 升級springboot到2.0.1版本試試看!
升級springboot到2.0.1版本
由於我們的專案是使用gradle進行專案構建,所以我們要建立一個springboot2.0.1的專案來看一下,2.0.1版本的配置有什麼不一樣,需要改哪些地方?
下面這是gradle構建springboot1.5.8版本的配置
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
jar {
enabled = true
}
dependencies {
compile project(":service-sss")
compile project(":service-xxx")
}
下面是構建springboot2.0.1版本的gradle配置
buildscript {
ext {
springBootVersion = '2.0.1.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile project(":service-xxx")
compile project(":service-sss")
}
想必你已經發現了哪裡有不同了,是的,除了版本號以外,2.0版本添加了一個外掛配置,具體幹什麼用的我還不清楚。把所有的配置都修改後重新整理一下gradle,你會發現你的gradle很可能出現問題! 什麼問題呢?他會提示你,你得gradle版本不行,要你升級到gradle4.0版本以上;那麼好,你說什麼我幹什麼;很簡單,去官網下載好zip安裝包,解壓就好了,然後開啟你的setting;
這樣就配置好了,很好,你也應該看到你的專案有無數個報錯了把!來把,改把!
修改JPA方法
如果你資料庫的互動用的jpa,那麼恭喜你,你麻煩大了,jpa中的集合進行了修改,做了很大的優化,他給你返回的是Optional物件,他給我們提供了很好的優化,很大長度上避免了我們返回null值導致後面程式報錯;
Optional<EsArticleEntity> esArticleEntity = esArticleRepository.findById(item);
if (!esArticleEntity.isPresent()) {
// 如果為空就能進去
System.out.println("如果能進來表示為null");
return;
}
// 如果取不到返回null
EsArticleEntity resultNull = esArticleEntity.orElse(null);
具體想了解,自行查詢資料把;
Redis配置修改
當你前面都不報錯了,建議你去看一下你的配置檔案,估計又是紅海行動了。
redis配置做了一些修改,這是springboot1.5版本的redis配置檔案:
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=XX.XX.XXX.XXX
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連線池中的最大空閒連線
spring.redis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.pool.min-idle=0
這是修改後的redis配置檔案
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=10.10.169.140
spring.redis.port=6379
# Redis伺服器連線密碼(預設為空)
spring.redis.password=
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.jedix.pool.max-active=8
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 連線池中的最大空閒連線
spring.redis.jedis.pool.max-idle=8
# 連線池中的最小空閒連線
spring.redis.jedis.pool.min-idle=0
裡面的配置類也大同小異,細心觀察下需要引數,修改起來應該沒什麼問題,如若不然,百度把,賊全!
欄位摺疊查詢
這就不多說什麼了,上程式碼把!
public ArrayList<EsArticleEntity> getOpinionArticleByCondition(PageParam pageParam, List<Integer> categoryIds, List<Integer> sourceIds, String keyword, LocalDateTime fromTime, LocalDateTime toTime, String order) {
SearchRequestBuilder searchBuilder = client.prepareSearch().setIndices("sentiment").setTypes("article");
CollapseBuilder headerCollapse = new CollapseBuilder("headerId");
searchBuilder.setCollapse(headerCollapse);
//建立builder,設定查詢條件
BoolQueryBuilder builder = QueryBuilders.boolQuery();
// 設定關鍵字查詢
if(StringUtils.isNotEmpty(keyword)){
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("content", keyword)));
queryBuilder.should(QueryBuilders.matchPhraseQuery("title", keyword).boost(10));
builder.must(queryBuilder);
}
// 設定分類查詢
builder.must(QueryBuilders.termsQuery("secondCategoryId", categoryIds));
// 設定來源查詢
if (Objects.nonNull(sourceIds) && sourceIds.size() > 0) {
builder.must(QueryBuilders.termsQuery("sourceId", sourceIds));
}
// 設定時間範圍查詢
if (Objects.nonNull(fromTime) && Objects.nonNull(toTime)) {
Long fromLong = LocalDateTimeUtils.getMilliByTime(fromTime);
Long toLong = LocalDateTimeUtils.getMilliByTime(toTime.plusDays(1).minusSeconds(1));
builder.must(QueryBuilders.rangeQuery("syncOnSecond")
.gt(fromLong/1000)
.lt(toLong/1000));;
}
FieldSortBuilder sort;
if ("ASC".equals(order)) {
sort = SortBuilders.fieldSort("id").order(SortOrder.ASC);
} else {
sort = SortBuilders.fieldSort("id").order(SortOrder.DESC);
}
searchBuilder = searchBuilder.setQuery(builder).addSort(sort);
// 這裡注意分頁是從第幾條開始,並不是第幾頁開始
SearchResponse response = searchBuilder.setFrom(pageParam.firstResult()).setSize(pageParam.getC()).get();
ArrayList<EsArticleEntity> resultData = new ArrayList<>();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit item : hits) {
String dataJson = item.getSourceAsString();
EsArticleEntity esData = JsonUtils.jsonToBean(dataJson, EsArticleEntity.class);
resultData.add(esData);
}
return dataMap;
}
這裡需要注意一下,這裡的response返回的總記錄數與實際的總記錄數不同,這裡返回的總記錄數是沒有進行欄位摺疊前的記錄數;我用的是二分法進行查詢資料的總記錄數;
Gradle打包
如果你都修改好了,你可以嘗試打包了;
gradle clean build
好,就是這樣的,對,報錯了把!
你可能說,我報錯不是這個,那應該是這個?找不到符號?找不到程式包?
應該就是這兩種情況,springboot2版本打包方式做了一些變化,你需要更改一下你的操作:
gradle clean bootJar
但是好像並不好用,怎麼辦?
在所有的gradle配置里加上這樣一個東西
buildscript {
ext {
springBootVersion = '2.0.1.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
// 新增這個後帶包會成功!
jar {
enabled = true
}
dependencies {
compile project(":service-xxx")
compile project(":service-sss")
}
一定要注意,把所有的gradle的配置檔案都加上這樣一行程式碼,再重新試一下gradle clean bootJar,應該成功了!
好了,最近遇到的問題大部分都在這裡簡答的說了一下,後續可能會更新,康桑密噠!
相關推薦
關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle、ElasticSearch欄位摺疊查詢)
關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle) 最近做專案遇到了一個很麻煩的需求,欄位摺疊,使用mysql查詢的話,簡化一下sql語句是這樣的,我在專案中的查詢涉及兩張表並且有
關於anaconda 找包,安裝包的一些總結(關於Anaconda中PackageNotFoundError: '' Package missing in current win-64 channe)
一、Anaconda作為一個工具包整合管理工具,下載python工具包是很方便的,直接敲: conda install package_name 但是有時候安裝一個工具包(如xmltodict)的時候,在當前的channels中找不到這個包,會提示: conda i
unity優化一些總結 (長期更新)
unity優化一些總結 (長期更新) UI: 1:儘量不要使用動態文字 2: 使用更多畫布 拆分畫布 我開始使用3幅畫布。一個用於我的背景影象,一個用於我的主要UI元素,另一個用於需要放置在其他所有元素頂部的元素。 我瞭解到,每當畫布中的某些內容發生變化時,整個畫布都會被重新評估並重新繪製。因此
陣列的去重方法總結(包括物件陣列的去重方法)
陣列的去除在真實專案中是非常的常用,那麼在這裡總結一下物件陣列及基本型別陣列的去重方法,主要利用了物件的鍵值是唯一的一個特性。 1:去重方法一利用陣列的索引對應的值。 let arr = [2,3,3,3,2,4,2]; console.log("arr is a instance of a
SpringBoot全域性異常捕獲及處理(包括自定義異常捕獲處理)
在做專案的時候需要對自定義異常做捕獲和處理,現在將程式碼記錄下來便於以後查閱。 1、全域性異常捕捉處理 @ControllerAdvice( annotations = {RestController.class} ) public class ExceptionHandlerAdv
SpringBoot2.0原始碼分析(四):spring-data-jpa分析
SpringBoot具體整合rabbitMQ可參考:SpringBoot2.0應用(四):SpringBoot2.0之spring-data-jpa JpaRepositories自動注入 當專案中存在org.springframework.data.jpa.repository.JpaRepositor
SpringBoot--05.SpringBoot2.0學習小結
1、SpringBoot2.0學習小結 用springBoot建立專案時、只關注三點:《啟動器》、《全域性屬性》、《啟動類》 (1)、啟動器 : pom.xml配置依賴父工程座標 <parent> <groupId>org.spring
SpringBoot--04.SpringBoot2.0整合mybatis
開發環境:jdk1.8 tomcat8.5 mybatis springboot2.0 maven工程 專案結構: 1、pom.xml引入依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmln
SpringBoot--03.SpringBoot2.0整合JdbcTemplate
開發環境:jdk1.8 tomcat8.5 maven工程 SpringBoot2.0 專案結構: 1、pom.xml檔案引入 <?xml version="1.0" encoding="UTF-8"?> <project xm
SpringBoot--02.SpringBoot2.0搭建Web專案
一、靜態資源訪問 SpringBoot入門參考:https://blog.csdn.net/sswqzx/article/details/84560202 SpringBoot提供 了靜態資源預設配置: Spring Boot預設提供靜態資源目錄位置需置於classpath
SpringBoot--01.SpringBoot2.0入門案例
一、SpringBoot簡介 1、SpringBoot概述(簡化配置、開箱即用) - 為所有 Spring 的開發者提供一個非常快速的、廣泛接受的入門體驗 - 開箱即用(啟動器starter-其實就是SpringBoot提供的一個jar包),但通過自己設定參 (.properties),
降低oracle高水位線方法總結(包括驗證結果)
1. 執行表重建指令 alter table table_name move(驗證不可行,不降低水位線,但可釋放表空間) 當你建立了一個物件如表以後,不管你有沒有插入資料,它都會佔用一些塊,ORACLE也會給它分配必要的空間.同樣,用ALTER TABLE MOVE釋放自由空間後,還是保留了一些
初學JDBC的一些總結(一)
1、關於JDBC的的個人理解: JDBC(Java Data Base Connectivity,java 資料庫連線)是用於執行 SQL 語句的 JavaAPI,可以為多種關係型資料庫提供統一的訪問方式,它由一組用 Java 語言編寫的類和介面組成。JDBC 提供了一種基準,據此可以構建更高階的工具和
vue總結(包括:指令的使用,axios)
一,axios的用法 1,配置: *引入axios *與APP.vue建立一個http-common.js檔案(使用axios模組,除錯埠)用來給其他模組複用 2,使用: *在其他元件檔案中匯入http元件 va
Win10作業系統下Oracle VM VirtualBox6.0載入磁碟提示“發現無效設定”的解決方法(包括“不能橋接網絡卡”問題的解決方法)
自從電腦換成Win10作業系統後,想借助VMBox處理一些事情,但是遇到了不能橋接網絡卡的問題,還以為是程式壞了,於是解除安裝重新安裝,但是不行。接著又嘗試在虛擬機器裡重新安裝作業系統,還是不行。
SpringBoot2.0填坑(二):elastic search 報錯{"error":{"root_cause":[{"type":"index_not_found_exception","...
執行程式碼 @GetMapping("searchAll") public ESDatas<DiskFile> searchAll(){ DiskFile diDiskFileDto = new DiskFile(); diDiskFi
SpringBoot2.0填坑(一):使用CROS解決跨域並解決swagger 訪問不了問題
簡介 公司後臺是採用SpringBoot2.0 搭建的微服務架構,前端框架用的是vue 使用前後端分離的開發方式,在開發聯調的時候需要進行跨域訪問,那麼使用CROS解決了跨域問題,但是swagger 卻用不了 具體解決方案請繼續往下看… CROS跨域原理 跨域資源共享(CORS)
SpringBoot專案的logback日誌配置(包括列印mybatis的sql語句)
我在這就開門見山直接介紹我們專案日誌的配置使用吧!~ 1、基本介紹 預設情況下,Spring Boot專案就會用Logback來記錄日誌,並用INFO級別輸出到控制檯。如下圖: 實際開發中我們不需要直接新增logback日誌依賴。 你會
看kali教程的一些總結(i春秋上的kali吧教程)
windows 雨滴 美化 區域網 斷網攻擊 arp攻擊 arpspoof -i 網絡卡 -t 目標ip 閘道器 檢視區域網當中的ip Fping -asg 網段 獲取內網妹子的qq arp欺騙 : 目標的IP流量經過我的網
shell中的fork、source和exec總結(包括環境變數)
摘要:對fork,source和exec三種方式執行shell指令碼的總結。 準備知識 1.我們所執行的任何程式,都是由父程序(parent process)所產生出來的一個子程序(child process),子程序在結束後,將返回到父程序去。此一現像在Linux系統中被稱為 fork。當子程序被產生