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

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-console
    
    配置说明:
    • DB_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:01:02