You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成Derby:避免重启应用时表被重建的解决方案

解决Derby嵌入式数据库每次启动清空数据的问题

这问题我之前做Spring Boot小项目时也踩过坑!你现在遇到的情况,核心原因是当前用的是内存版Derby——EmbeddedDatabaseBuilder默认创建的Derby数据库是存在内存里的,应用一重启,内存里的数据自然就没了。要保留数据,得把Derby改成文件持久化模式,具体操作如下:

1. 替换内存版DataSource配置

放弃用EmbeddedDatabaseBuilder创建内存数据库,改用支持文件存储的DataSource配置。推荐用Spring Boot默认的Hikari连接池,代码示例:

@Bean
public DataSource dataSource() {
    HikariDataSource dataSource = new HikariDataSource();
    dataSource.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
    // 指定本地文件存储路径,这里会在项目根目录生成derby-db文件夹保存数据
    dataSource.setJdbcUrl("jdbc:derby:derby-db;create=true");
    dataSource.setUsername("your-username");
    dataSource.setPassword("your-password");
    return dataSource;
}

2. 调整初始化脚本为幂等性

原来的create-db.sql里如果用的是CREATE TABLE,每次启动都会删除旧表重建,这也是数据丢失的原因之一。改成CREATE TABLE IF NOT EXISTS,确保只有表不存在时才创建:

-- 示例:创建users表,仅当表不存在时执行
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);

3. (可选)用Spring Boot自动配置简化代码

如果不想手动写DataSource Bean,直接在application.properties里配置更省心:

# Derby持久化配置
spring.datasource.url=jdbc:derby:derby-db;create=true
spring.datasource.driver-class-name=org.apache.derby.jdbc.EmbeddedDriver
spring.datasource.username=your-username
spring.datasource.password=your-password

# 控制初始化脚本执行时机:仅在嵌入式数据库首次创建时执行
spring.sql.init.mode=embedded

关键说明:

  • jdbc:derby:derby-db;create=true中的derby-db是数据库文件的存储目录,你可以改成任意路径(比如/opt/derby-data),只要应用有读写权限就行。create=true表示如果目录不存在就自动创建,存在则直接连接已有数据库。
  • 如果你还是想保留EmbeddedDatabaseBuilder的写法,也可以手动指定JDBC URL为文件路径,但不如直接配置DataSource灵活。

这样配置后,下次重启应用时,Derby会直接读取本地文件里的已有数据,不会再清空重建表啦!

内容的提问来源于stack exchange,提问作者SAGAR PALIWAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:23:12