Grails 4.1.0应用DataSource未加载MySQL配置仍连H2问题
问题分析与解决方案
以下是导致Grails 4.1.0应用未加载MySQL数据源、仍连接H2的常见原因及解决办法:
1. 环境未正确激活
Grails会根据启动时指定的环境加载对应配置。如果启动应用时未明确指定development环境,默认会使用default环境(该环境默认配置为H2)。
- 解决办法:启动应用时添加环境参数,比如:
或在IDE运行配置中设置./gradlew bootRun -Dgrails.env=developmentgrails.env=development系统属性。
2. H2依赖未彻底清理
即使手动移除了com.h2database:h2依赖,项目中可能存在其他依赖(如Grails测试依赖、第三方插件)间接引入H2。此时JVM仍能加载H2驱动,导致默认连接逻辑 fallback 到H2。
- 解决办法:
- 执行依赖清理命令:
./gradlew clean build --refresh-dependencies - 检查依赖树并排除间接引入的H2:
在./gradlew dependencies | grep h2build.gradle中添加排除规则:configurations.all { exclude group: 'com.h2database', module: 'h2' }
- 执行依赖清理命令:
3. groovy.sql.Sql未使用Spring管理的DataSource
直接调用无参Sql.newInstance()时,不会自动绑定Grails配置的DataSource bean,而是会走JDBC默认连接逻辑(因残留H2驱动连接到内存H2库)。
- 解决办法:
- 注入Grails的
dataSourcebean创建Sql实例:import groovy.sql.Sql import javax.sql.DataSource class YourService { DataSource dataSource def executeQuery() { def sql = new Sql(dataSource) // 执行查询逻辑 sql.close() } } - 脚本场景可通过
Holders获取DataSource(不推荐在服务类中使用):import groovy.sql.Sql import grails.util.Holders def sql = new Sql(Holders.applicationContext.getBean('dataSource'))
- 注入Grails的
4. 配置文件被覆盖
存在其他配置源(如application.groovy、系统属性、环境变量)覆盖了application.yml的MySQL配置。比如application.groovy中仍保留H2配置,其优先级高于application.yml。
- 解决办法:
- 检查
grails-app/conf下所有配置文件,确保development环境的数据源配置统一指向MySQL。 - 检查启动参数,移除覆盖数据源的系统属性(如
-DdataSource.url=jdbc:h2:mem:devDb)。
- 检查
内容的提问来源于stack exchange,提问作者Prince Mishra
相关产品推荐
相关产品推荐

