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
相关产品推荐
相关产品推荐

