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

Spring 2.6.9升级至2.7.0时H2数据库CGLIB子类生成失败求助

问题解决方法

错误原因

H2 2.1.120版本将org.h2.jdbcx.JdbcConnectionPool标记为final类,而Spring对DataSource bean做代理时默认使用CGLIB(需要继承目标类),final类无法被继承,因此抛出无法生成子类的异常。

解决方案

方案1:移除自定义DataSource配置(推荐)

Spring Boot已提供自动配置DataSource的能力,你的application.properties已经配置了H2的参数,完全不需要手动编写DataSourceConfig类。直接删除该类即可,Spring会自动创建符合要求的DataSource bean,同时避免代理冲突问题。

方案2:修改自定义DataSource的返回类型

如果必须保留自定义配置,不要直接返回JdbcConnectionPool实例,改为返回javax.sql.DataSource接口类型,或者使用Spring提供的数据源包装类:

@Bean(name = "dataSource")
DataSource datasource() {
    // 使用DriverManagerDataSource替代JdbcConnectionPool
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.h2.Driver");
    dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE");
    dataSource.setUsername("sa");
    dataSource.setPassword("password");
    return dataSource;
}

这样Spring可以通过JDK动态代理(基于接口)实现代理逻辑,无需继承final类。

额外注意事项

  • 你的自定义DataSource中用户名是user、密码是password,但application.properties里配置的是sa和password,两者需保持一致避免连接错误。
  • Spring Boot默认使用HikariCP作为连接池,推荐优先使用自动配置的Hikari数据源,性能和稳定性更优。

内容的提问来源于stack exchange,提问作者Zahid Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:27:17