关于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,应该成功了!
好了,最近遇到的问题大部分都在这里简答的说了一下,后续可能会更新,康桑密哒!