SpringBoot 从 2.0.6 升级至 2.4.1 要进行的修改如下
1.升级Mysql驱动版本
在 SpringBoot 2.1 中 Mysql驱动版本 由 mysql-connector-java-5 升级成为了 mysql-connector-java-6,
mysql-connector-java-6 中 新增了一项属性为: serverTimezone 时区属性,且进行数据库连接时必须添加该属性。
YAML 配置如下:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/databasename?serverTimezone=Asia/Shanghai
username: root
password: root
若使用了 logback 日志配置文件,那么相应xml文件的驱动也要进行修改且在后方加上 ?serverTimezone=Asia/Shanghai 即可。
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.cj.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databasename?serverTimezone=Asia/Shanghai</url>
<user>root</user>
<password>root</password>
</connectionSource>
2.修改原有依赖或添加新包
1.若你在项目中使用了如 @NotNull @Length 等的 Hibernate-Validator 注解,因为新版本中已经移除了该依赖,那么在新版本中你则需要手动导入该依赖。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.6.Final</version>
</dependency>
2.又或者你跟我们一样使用了 JedisPool 并且封装了一个工具类,那么你要进行如下更改:
原本的 JedisPool 使用 returnBrokenResource 和 returnResource 方法关闭线程池,那么现在若你在jdk1.7以上那么现在可以使用 try–with-resource 方法自动关闭线程池,当然你也可以选择手动添加一个 finally 方法 手动调用 jedis.close。
更新前:
try {
jedis = jedisPool.getResource();
result = jedis.expire(key, exTime);
} catch (Exception e) {
logger.error("expire key:{} exTime:{} error", key, exTime, e);
jedisPool.returnBrokenResource(jedis);
return result;
}
}
jedisPool.returnResource(jedis);
return result;
try-with-resources:
try (Jedis jedis = jedisPool.getResource()) {
result = jedis.expire(key, exTime);
} catch (Exception e) {
logger.error("expire key:{} exTime:{} error", key, exTime, e);
return result;
}
finally:
try {
jedis = jedisPool.getResource();
result = jedis.hdel(key, field);
} catch (Exception e) {
logger.error("expire key:{} exTime:{} error", key, exTime, e);
return result;
} finally {
if (jedis != null) {
jedis.close();
}
}
-
若你使用了 junit4 单元测试的注解那么在新版本中你需要将其改为junit5 的单元测试注解
当然他的升级是很方便的,你只需要移除原本的 @RunWith(SpringRunner.class) 只留下 @SpringBootTest 即可
或者你还想继续使用 junit4 来进行单元测试,那么只要手动导入 junit4 的依赖即可。
-
此处省略测试过程。
3.其他内容
1.Docker日志时间与外部时间不一致解决方案
若你也使用了 Docker 进行镜像打包,那么也许你会遇到在日志输出的时间及用本地时间函数时获取的时间与外部时间不一致,那么解决办法如下:
在 DockerFile 文件中添加以下语句
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
那么在进行镜像打包时,便会指定容器时区。
2.在改完时区之后,发现订单创建时间比内部慢了8小时,经过排查发现原来是原本数据库中存储的时间戳比现在时间快8小时因此需要对数据库时间戳进行一次清洗,那么清洗语句如下:
使用数据库为Mysql,其余数据库请自行百度
1.首先查询订单数据并进行-8小时时间转换检测削减后时间是否正确,因我们前8位数字是按日期生成所以这是要清洗的数据条件
(PS:因为数据量并不是很大所以一次性更新完即可)
SELECT
code,
OrderTime,
DATE_ADD(from_unixtime(OrderTime),INTERVAL -8 HOUR)
FROM ax_crm_work_order
WHERE
LEFT ( CODE, 8 ) > "20201201"
AND
LEFT ( CODE, 8 ) < "20201213"
2.若时间无异常,那么即可进行批量更改
UPDATE ax_crm_work_order
SET OrderTime = unix_timestamp( DATE_ADD( from_unixtime( OrderTime ), INTERVAL -8 HOUR ))
WHERE
LEFT ( CODE, 8 ) > "20201201"
AND
LEFT ( CODE, 8 ) < "20201213"
至此,到此结束!