Spring集成H2内存数据库报CUSTOMERS表不存在异常如何解决
问题排查与解决方法
这个报错的核心原因是应用进程连接的H2数据库实例,和你在H2控制台建表时连接的实例完全独立,叠加配置项写错、自定义DataSource逻辑错误的问题,按以下步骤修复即可:
- 修正application.yml配置路径错误
Spring Boot数据源配置的前缀是spring.datasource,你当前写的spring.database是无效路径,配置的url、连接参数都不会被加载。修正后的配置如下,直接把H2参数拼在JDBC URL里避免不生效:
配置说明:spring: datasource: url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=true driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true path: /h2-consoleDB_CLOSE_DELAY=-1:保证内存数据库不会因为最后一个连接断开就被清空,避免控制台建表后连接关闭、库被销毁的问题DATABASE_TO_UPPER=true:默认表名自动转大写,不区分大小写,避免建表写小写表名、查询大写表名找不到的问题
- 删除手动注册DataSource的代码
你写的EmbeddedDatabaseBuilder生成的DataSource默认会连接一个随机名称的全新空H2内存库,完全不会读取yml里的数据源配置,相当于应用启动后单独开了个空库,自然找不到你在控制台建的CUSTOMERS表。删掉这个@Bean定义的dataSource()方法后,Spring Boot会自动根据yml配置创建连接到testdb的数据源,和H2控制台连同一个实例。 - 校验H2控制台连接参数
打开H2控制台登录页时,确认JDBC URL输入框的内容和yml里配置的jdbc:h2:mem:testdb完全一致,不要使用页面默认生成的随机URL,否则还是会连接到其他空实例。 - (推荐)改用SQL脚本自动初始化表结构
不要手动在H2控制台建表,把建表语句放到项目src/main/resources目录下的schema.sql文件中,插入初始化数据的语句放到同目录的data.sql中,Spring Boot启动时会自动执行脚本完成初始化,完全避免手动连错实例的问题。建表示例:CREATE TABLE IF NOT EXISTS CUSTOMERS ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INT );
调整完成后重启应用即可正常查询,如果仍报错可以在启动时断点查看DataSource实例的实际JDBC连接地址,确认是否和配置一致。
内容的提问来源于stack exchange,提问作者user18308772
相关产品推荐
相关产品推荐

