2月20到21这两天的项目维护

First Post:

Last Update:

2月20到21这两天的项目维护

关于Git

公司用的是云服务器搭建的GitLab,我遇到一个困扰挺久的问题,就是推送代码上去的时候经常出现报错:

image-20240221094907063

从网上寻找答案得知

413错误码——http请求实体太大

这要么是上传时我们这边的git有上传大小的限制,要么就是服务器那边做了限制,尝试修改本地Git上传大小限制无果之后原因就是后者了,而且GitLab大概率使用的是nginx搭建的,出于与搭建者并不熟悉的关系,只能不使用http方式上传,改用ssh。

1
2
3
4
5
6
原因分析:上传文件太大,超过了最大限制
解决方法:nginx传输限制:(nginx.conf)
       client_max_body_size 400M;
     git传输限制:
       git config --global http.postBuffer 524288000
       git config --global https.postBuffer 524288000

关于SSH配置,网上教程很多,无非就是生成Token,然后绑定到GitLab。

关于日志的打印

mybatis日志的打印一般会放在appplication.yml文件里面,而打印级别一般没放在一起,而是放在-dev / -prod文件(具体看application.xml${spring.profiles.active})里面的logging项里面

image-20240221104604135

关于打包

公司的项目不同于我在学校接触到的小项目,代码通过maven打包之后生成的是一个zip文件,里面包含了配置文件和依赖包,可以直接一键部署到服务器上,特别高效。

完整的pom文件build配置脱敏如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 设置编译版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 清单文件 -->
<manifest>
<mainClass>XXXApplication</mainClass>
<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 父工程开发版本需要加,不然依赖的父工程jar引用不了-->
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<!-- 给清单文件添加键值对(配置文件外置) -->
<manifestEntries>
<Class-Path>config/</Class-Path>
</manifestEntries>
</archive>
<classesDirectory>
</classesDirectory>
</configuration>
</plugin>
<!-- 拷贝依赖的jar包到lib目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 解决资源文件的编码问题 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!-- 过滤后缀文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>p12</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<!-- 打包source文件为zip文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

关于数据库出现0000-0000…日期错误

报错:MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘

在做数据迁移的时候出现了上面这个问题,应该不同的MySQL对日期初始值的设置不一样导致的,为了兼容这个问题,要把全局的sql_mode默认的NO_ZERO_DATE、NO_ZERO_IN_DATE去掉,参考博文

然后还要记得降级新部署的MySQL版本到5.7及以下

同时如果是Java项目,使用到jdbc时要在数据库url加上&zeroDateTimeBehavior=CONVERT_TO_NULL

image-20240222085849300

结合 Redis 对文件判重的一个实现

2024.02.23:今天学习到一个专业术语来描述这个效果:幂等

前面对导入文件进行了优化,项目管理就提了一个问题:

image-20240221134121901

整个系统上传文件都限制在2M以内,调了接口就算离开页面,只要上传结束并不会对导入的数据造成影响,后端会一直处理直到数据全部导入。因此,应该规避的就是用户重复上传。结合自身能力,我选择利用Redis来实现这一简单的功能。

我的思路是获取收到的文件的哈希值,判断该哈希是否存在于缓存中,如果是新哈希,就将其存储到Reids,缓存时间设置为6分钟,代码实现如下:

Redis业务层主要有三个功能:判断哈希值是否已经存在、添加文件哈希进缓存、设置缓存时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.concurrent.TimeUnit;

@Service
public class FileHashServiceImpl implements FileHashService {

private static final String FILE_HASH_KEY = "file_hashes";

@Autowired
private RedisTemplate<String, String> redisTemplate;

public boolean isFileHashExists(String hash) {
return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(FILE_HASH_KEY, hash));
}

public void addFileHash(String hash) {
redisTemplate.opsForSet().add(FILE_HASH_KEY, hash);
}

// 设置文件哈希过期时间 (e.g., 24 hours)
public void setFileHashExpiration(String hash, long timeout, TimeUnit unit) {
redisTemplate.expire(FILE_HASH_KEY, timeout, unit);
}
}

控制层

1
2
3
4
5
6
7
8
// 获取文件哈希,判断是否重复上传
String sha256Hex = DigestUtil.sha256Hex(file.getInputStream());
if(!fileHashService.isFileHashExists(sha256Hex)) {
fileHashService.addFileHash(sha256Hex);
fileHashService.setFileHashExpiration(sha256Hex, 6, TimeUnit.MINUTES);
} else {
return new Result("0", "请勿重复上传");
}