Spring Boot应用跟踪已读文件避免数据库重复入库的方案及Maven依赖咨询
解决方案:跟踪已读取的JSON文件避免数据库重复插入
核心跟踪实现方式
1. 数据库记录表跟踪(推荐,适用于生产环境)
创建一张专门的记录表(比如processed_files),用来存储已处理的文件信息,字段建议包含:
file_name:文件名(设为唯一约束)file_path:文件完整路径(可选,避免同名文件冲突)processed_timestamp:处理时间file_hash:文件哈希值(可选,用于检测文件是否被修改后重新处理)
实现逻辑:
- 应用启动时(通过
ApplicationRunner或CommandLineRunner)扫描目标目录下的所有JSON文件 - 将扫描到的文件与
processed_files表中的记录对比,筛选出未存在的文件 - 处理未记录的文件(解析JSON、插入数据库),处理完成后将文件信息写入记录表
- 若要支持文件修改后重新处理,可在对比时校验哈希值,不一致则重新执行处理并更新记录
2. 文件系统标记法(轻量方案)
无需修改数据库,通过文件本身或目录来标记状态:
- 目录分离:创建
unprocessed和processed两个目录,未处理的JSON放在unprocessed,处理完成后移动到processed目录 - 后缀标记:处理完成后给文件名添加后缀(比如
data.json改为data.json.processed),启动时只扫描不带该后缀的JSON文件
3. 配置文件记录(仅适用于小型单实例场景)
在application.yml或application.properties中手动记录已处理的文件名列表:
processed-files: - data1.json - data2.json
启动时读取这个配置项,对比目录中的文件,处理未在列表中的文件后更新配置。此方案缺点明显:配置文件维护麻烦,多实例部署时无法同步状态。
Spring Boot 相关Maven依赖
数据库跟踪所需依赖
如果采用数据库记录表方案,需要Spring Data JPA和对应数据库的驱动:
<!-- Spring Data JPA 提供ORM及数据访问支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL 驱动(根据实际使用的数据库替换,比如PostgreSQL、H2等) --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency>
可选工具依赖
如果需要简化文件扫描、移动等操作,可引入Apache Commons IO:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.15.1</version> </dependency>
注意事项
- 数据库方案中,处理文件与插入记录需放在同一个事务中,避免处理成功但记录未写入导致重复处理
- 哈希值计算可使用
MessageDigest类实现,确保文件内容变更时能被检测到 - 多实例部署场景下,优先选择数据库记录表方案,避免文件系统标记的状态不一致问题
内容的提问来源于stack exchange,提问作者Robert Głowacki
相关产品推荐
相关产品推荐

