ORDS无法写入数据库求助:Weblogic环境下读写异常排查
基于Weblogic与ORDS的数据库写入失败问题排查与解决方案
我们的应用基于Weblogic与ORDS(Oracle REST Data Service)搭建,目前遇到数据库写入失败问题:查询操作正常,但所有插入/更新操作均抛出异常,疑似ORDS缺少写入权限,具体报错信息如下:
Aug 24, 2023 7:23:10 PM oracle.dbtools.injector.impl.InjectorLog finest FINEST: No provider found for: requires java.sql.Connection with constraint: (provides @Named(ords) java.sql.Connection) oracle.dbtools.injector.impl.MissingDependencyException: No provider found for: requires java.sql.Connection with constraint: (provides @Named(ords) java.sql.Connection) at oracle.dbtools.injector.impl.MissingDependencyException.noProvider(MissingDependencyException.java:75) at oracle.dbtools.injector.impl.MissingDependencyException.noProvider(MissingDependencyException.java:62) at oracle.dbtools.injector.impl.DependencyInjectionException.instantationError(DependencyInjectionException.java:107) at oracle.dbtools.injector.impl.ServiceFactory.instantiate(ServiceFactory.java:122) at oracle.dbtools.injector.impl.ServiceFactory$ResolvedDependenciesFactory.newInstance(ServiceFactory.java:366) at oracle.dbtools.injector.impl.ServiceFactory$ResolvedSingletons.newInstance(ServiceFactory.java:393) at oracle.dbtools.injector.impl.SingletonsBase.get(SingletonsBase.java:35) at oracle.dbtools.injector.impl.ServiceFactory.resolveDependencies(ServiceFactory.java:244) at oracle.dbtools.injector.impl.ServiceFactory.instantiate(ServiceFactory.java:97) at oracle.dbtools.injector.impl.ServiceFactory$InstanceFactory.newInstance(ServiceFactory.java:348) at oracle.dbtools.injector.impl.Singletons.newInstance(Singletons.java:121) at oracle.dbtools.injector.impl.SingletonsBase.get(SingletonsBase.java:35) at oracle.dbtools.injector.impl.ServiceFactory.newInstance(ServiceFactory.java:55) at oracle.dbtools.injector.impl.InjectorImpl.select(InjectorImpl.java:180) at oracle.dbtools.injector.impl.InjectorImpl$SelfServices.select(InjectorImpl.java:451) at oracle.dbtools.auth.Authenticators.authenticate(Authenticators.java:44) at oracle.dbtools.http.auth.AuthenticationFilter.authenticate(AuthenticationFilter.java:73) at oracle.dbtools.http.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:64) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.url.mapping.RequestMapperImpl.doFilter(RequestMapperImpl.java:158) at oracle.dbtools.url.mapping.URLMappingBase.doFilter(URLMappingBase.java:89) at oracle.dbtools.url.mapping.db.DatabaseTenantMapping.dispatchSelf(DatabaseTenantMapping.java:212) at oracle.dbtools.url.mapping.db.DatabaseTenantMappingBase.doFilter(DatabaseTenantMappingBase.java:51) at oracle.dbtools.url.mapping.tenant.TenantMappingDispatcher.dispatch(TenantMappingDispatcher.java:59) at oracle.dbtools.url.mapping.db.DatabaseTenantMappingBase.dispatchChild(DatabaseTenantMappingBase.java:152) at oracle.dbtools.url.mapping.db.DatabaseTenantMappingBase.doFilter(DatabaseTenantMappingBase.java:49) at oracle.dbtools.jdbc.pools.local.DefaultLocalTenantMapping.doFilter(DefaultLocalTenantMapping.java:100) at oracle.dbtools.url.mapping.tenant.TenantMappingDispatcher.dispatch(TenantMappingDispatcher.java:59) at oracle.dbtools.url.mapping.tenant.TenantMappingFilter.doFilter(TenantMappingFilter.java:84) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.forwarding.ForwardingFailedFilter.doFilter(ForwardingFailedFilter.java:41) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.auth.external.ExternalSessionFilter.doFilter(ExternalSessionFilter.java:59) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.apex.support.auth.ApexSessionQueryRewriteFilter.doFilter(ApexSessionQueryRewriteFilter.java:58) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.cors.CORSResponseFilter.doFilter(CORSResponseFilter.java:90) at oracle.dbtools.http.filters.HttpResponseFilter.doFilter(HttpResponseFilter.java:45) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.filters.AbsoluteLocationFilter.doFilter(AbsoluteLocationFilter.java:65) at oracle.dbtools.http.filters.HttpResponseFilter.doFilter(HttpResponseFilter.java:45) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.auth.external.ExternalAccessValidationFilter.doFilter(ExternalAccessValidationFilter.java:59) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.errors.ErrorPageFilter.doFilter(ErrorPageFilter.java:87) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.secure.ForceHttpsFilter.doFilter(ForceHttpsFilter.java:74) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.auth.ForceAuthFilter.doFilter(ForceAuthFilter.java:44) at oracle.dbtools.http.filters.HttpFilter.doFilter(HttpFilter.java:47) at oracle.dbtools.http.filters.FilterChainImpl.doFilter(FilterChainImpl.java:64) at oracle.dbtools.http.filters.Filters.filter(Filters.java:67) at oracle.dbtools.http.entrypoint.EntryPoint.service(EntryPoint.java:70) at oracle.dbtools.http.entrypoint.EntryPointServlet.service(EntryPointServlet.java:130) at oracle.dbtools.entrypoint.WebApplicationRequestEntryPoint.service(WebApplicationRequestEntryPoint.java:50) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:295) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:353) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2329) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2307) at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1798) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1752) at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:272) Caused by: oracle.dbtools.plugin.api.types.TypeDependencyNotAvailableException: The type: class oracle.dbtools.oauth.OAuthProviderImpl could not be instantiated due to missing dependency: (provides @Named(ords) java.sql.Connection) java.sql.Connection at oracle.dbtools.plugin.api.types.TypeDependencyNotAvailableException.from(TypeDependencyNotAvailableException.java:49) at oracle.dbtools.plugin.api.types.TypeDependencies.newInstance(TypeDependencies.java:142) at oracle.dbtools.plugin.api.types.TypeReflections$ReflectiveInstantiator.load(TypeReflections.java:530) at oracle.dbtools.injector.impl.ServiceFactory.instantiate(ServiceFactory.java:119) ... 88 more
解决方案
- 检查ORDS数据库用户权限:确保ORDS使用的数据库用户拥有INSERT、UPDATE权限,针对写入操作涉及的表,直接授予
INSERT ON [表名]、UPDATE ON [表名]权限;若需批量配置,可授予RESOURCE角色(遵循权限最小化原则,避免过度授权)。 - 验证Weblogic中ORDS数据源配置:检查数据源的事务属性,确认已开启事务支持;核对连接池的连接参数,确保
@Named(ords)的连接配置正确,未出现拼写错误或配置遗漏;同时检查连接池的最大连接数、超时时间,避免连接耗尽导致写入操作无法获取连接。 - 修复ORDS OAuth配置:报错显示OAuthProviderImpl实例化失败,需确认ORDS配置文件(如
ords_params.properties)中oauth.connection参数指向正确的数据源,或在Weblogic部署描述中配置了对应命名的连接,确保OAuth元数据存储的连接可用。 - 重新部署ORDS应用:修改配置后,停止并重新部署Weblogic中的ORDS应用,清理Weblogic缓存目录(如
servers/[server_name]/tmp),确保新配置完全加载。 - 查看数据库审计日志:检查数据库端的审计日志,确认写入操作是否存在权限拒绝记录,部分情况下连接缺失的表象实际是数据库端权限限制导致的连接初始化失败。
内容的提问来源于stack exchange,提问作者Coder12345
相关产品推荐
相关产品推荐

