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

Grails 4.1.0应用DataSource未加载MySQL配置仍连H2问题

问题分析与解决方案

以下是导致Grails 4.1.0应用未加载MySQL数据源、仍连接H2的常见原因及解决办法:

1. 环境未正确激活

Grails会根据启动时指定的环境加载对应配置。如果启动应用时未明确指定development环境,默认会使用default环境(该环境默认配置为H2)。

  • 解决办法:启动应用时添加环境参数,比如:
    ./gradlew bootRun -Dgrails.env=development
    
    或在IDE运行配置中设置grails.env=development系统属性。

2. H2依赖未彻底清理

即使手动移除了com.h2database:h2依赖,项目中可能存在其他依赖(如Grails测试依赖、第三方插件)间接引入H2。此时JVM仍能加载H2驱动,导致默认连接逻辑 fallback 到H2。

  • 解决办法:
    • 执行依赖清理命令:
      ./gradlew clean build --refresh-dependencies
      
    • 检查依赖树并排除间接引入的H2:
      ./gradlew dependencies | grep h2
      
      在build.gradle中添加排除规则:
      configurations.all {
          exclude group: 'com.h2database', module: 'h2'
      }
      

3. groovy.sql.Sql未使用Spring管理的DataSource

直接调用无参Sql.newInstance()时,不会自动绑定Grails配置的DataSource bean,而是会走JDBC默认连接逻辑(因残留H2驱动连接到内存H2库)。

  • 解决办法:
    • 注入Grails的dataSource bean创建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'))
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:36:06