Grails 5项目Oracle数据库连接异常:查询无结果求助
Grails 5 Oracle数据库查询返回0条数据的排查方案
1. 修正JDBC驱动依赖配置
你当前使用compileOnly依赖lib目录下的ojdbc7.jar,这会导致运行时无法加载驱动类。Grails 5基于Spring Boot,需确保驱动在运行时可用,修改build.gradle的依赖配置:
dependencies { runtimeOnly fileTree(dir: 'lib/', include: '*.jar') // 若能从Maven仓库获取,更推荐使用官方依赖(如有权限): // runtimeOnly 'com.oracle.database.jdbc:ojdbc7:12.1.0.2' }
修改后执行gradle clean build重新构建项目。
2. 适配HikariCP连接池配置
Grails 5默认使用HikariCP作为连接池,你当前配置的是Tomcat JDBC连接池的参数,这些参数在HikariCP中不生效,可能导致连接异常或查询失败。替换为HikariCP标准配置:
dataSource: pooled: true jmxExport: true driverClassName: oracle.jdbc.OracleDriver logSql: true # 开启日志,查看实际执行的SQL语句 hikari: maximumPoolSize: 50 minimumIdle: 5 connectionTimeout: 10000 idleTimeout: 60000 validationTimeout: 5000 connectionTestQuery: "SELECT 1 FROM DUAL" testOnBorrow: true environments: development: dataSource: url: jdbc:oracle:thin:@xxxx.xx.xx:1521:xxx username: 'xxx' password: 'xxx'
注意:HikariCP无需
maxIdle、initialSize这类参数,它会自动管理连接池大小。开启logSql可确认实际执行的SQL是否符合预期。
3. 检查域类与数据库表的映射关系
Oracle默认将表名、列名转换为大写,而Grails域类默认用小写名称映射。若数据库表为大写(如USER_INFO),需在域类中显式指定表名:
class UserInfo { String name // 其他属性 static mapping = { table 'USER_INFO' // 匹配Oracle的大写表名 // 若列名也是大写,需同步指定: // name column: 'USER_NAME' } }
4. 验证数据库连接有效性
在控制器中添加原生SQL查询代码,验证是否能直接获取数据:
def testConnection() { def sql = new groovy.sql.Sql(dataSource) def result = sql.rows("SELECT COUNT(*) FROM YOUR_TABLE_NAME") render "查询结果:${result[0][0]}" }
若这段代码能返回正确计数,说明问题出在GORM映射配置;若仍返回0,需检查连接URL、用户名密码是否正确,或数据库用户权限是否足够。
5. 确认数据库用户权限
确保配置的数据库用户拥有目标表的SELECT权限,可在Oracle客户端执行:
GRANT SELECT ON YOUR_TABLE_NAME TO YOUR_USER;
内容的提问来源于stack exchange,提问作者Cristina
相关产品推荐
相关产品推荐

