Dropwizard应用连接Oracle SQL时如何在配置中指定表名
Dropwizard连接Oracle时validationQuery报找不到表名的解决方法
问题相关配置
当前使用的Oracle数据源配置如下:
oracleDataSource: driverClass: oracle.jdbc.OracleDriver user: root password: 123 url: jdbc:oracle:thin:@//194.18.4.101:1521/serviceName123 properties: charSet: UTF-8 hibernate.dialect: org.hibernate.dialect.Oracle10gDialect hibernate.show_sql: true hibernate.current_session_context_class: org.hibernate.context.internal.ManagedSessionContext hibernate.hbm2ddl.auto: none hibernate.jdbc.batch_size: 20 maxWaitForConnection: 1s minSize: 1 initialSize: 4 maxSize: 5 checkConnectionWhileIdle: true validationInterval: 10s minIdleTime: 1 minute validationQuery: SELECT 1 FROM DUAL
问题表现
配置生效后validationQuery执行失败,报错提示无法获取对应表名。
解决方案
- 先明确基础逻辑:Oracle中
DUAL是SYS用户下的内置公共同义词,属于数据库自带的系统对象,不需要手动创建或额外指定自定义表名,报错本质是权限或配置错误,按以下顺序排查调整即可:- 校验连接用户权限:确认配置里的
root用户已被授予CREATE SESSION基础连接权限,同时拥有PUBLIC同义词的访问权限。如果因为权限管控无法开放DUAL访问权限,可以将validationQuery替换为该用户名下有权限的任意业务表查询,注意加ROWNUM=1限制避免全表扫描,示例配置:validationQuery: SELECT 1 FROM 你的业务表名 WHERE ROWNUM = 1 - 校验JDBC URL正确性:确认
194.18.4.101:1521监听下的serviceName123服务名是目标Oracle实例的正确服务名,连错实例、服务名拼写错误都会导致访问不到系统内置的DUAL表。 - 移除手动配置的validationQuery:Dropwizard高版本默认使用Hikari连接池,会自动根据Oracle驱动匹配最优的连接校验语句,直接删除配置里的
validationQuery项即可,不需要手动写校验语句,能规避大部分手动配置带来的兼容问题。
- 校验连接用户权限:确认配置里的
注意:连接校验语句必须是执行开销极低的轻量化语句,禁止使用无where条件的大表查询作为校验语句,否则会大幅拖慢连接池检测效率,甚至拖垮数据库性能。
内容的提问来源于stack exchange,提问作者maulik trapasiya
相关产品推荐
相关产品推荐

