1. 程式人生 > >關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle、ElasticSearch欄位摺疊查詢)

關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle、ElasticSearch欄位摺疊查詢)

關於springboot升級到springboot2.0的一些問題總結(包括ElasticSearch、Redis、Gradle)

最近做專案遇到了一個很麻煩的需求,欄位摺疊,使用mysql查詢的話,簡化一下sql語句是這樣的,我在專案中的查詢涉及兩張表並且有多項不定項的查詢條件,也就是需要sql拼接;

select * fromgroup 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;
配置gradle
這樣就配置好了,很好,你也應該看到你的專案有無數個報錯了把!來把,改把!

修改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

好,就是這樣的,對,報錯了把!
報錯資訊
你可能說,我報錯不是這個,那應該是這個?找不到符號?找不到程式包?

報錯資訊2
應該就是這兩種情況,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一些問題總結包括ElasticSearchRedisGradleElasticSearch摺疊查詢

關於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中的forksource和exec總結包括環境變數

摘要:對fork,source和exec三種方式執行shell指令碼的總結。 準備知識 1.我們所執行的任何程式,都是由父程序(parent process)所產生出來的一個子程序(child process),子程序在結束後,將返回到父程序去。此一現像在Linux系統中被稱為 fork。當子程序被產生