WebLogic 14.1.1配置Postgres JDBC连接遇ClassNotFound问题求助
WebLogic 14.1.1 Postgres JDBC连接报ClassNotFound: weblogic.jdbc.wrapper.PoolConnection的解决方法
问题背景
在WebLogic 14.1.1中配置Postgres JDBC连接:
- 已将Postgres JDBC jar包放入域的
lib文件夹 - 管理控制台配置数据源后测试连接成功
- 实际使用时抛出
java.lang.ClassNotFoundException: weblogic.jdbc.wrapper.PoolConnection异常 - 尝试将包含该类的
com.bea.core.datasource6.jar复制到域lib后,服务器无法启动 - Oracle数据源配置无此问题
完整堆栈信息:
####<Feb 23, 2023, 10:40:21,445 AM Central European Standard Time> <Error> <HTTP Session> <MacBook-Pro.local> <AdminServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <fb856892-8489-4b11-beea-d232c77f0c0c-00000024> <167> java.lang.AssertionError: java.lang.ClassNotFoundException: weblogic.jdbc.wrapper.PoolConnection at weblogic.utils.wrapper.WrapperFactory.getWrapperClass(WrapperFactory.java:225) at weblogic.utils.wrapper.WrapperFactory.getWrapperClass(WrapperFactory.java:190) at weblogic.jdbc.wrapper.JDBCWrapperFactory$1.run(JDBCWrapperFactory.java:178) at java.base/java.security.AccessController.doPrivileged(Native Method) at weblogic.jdbc.wrapper.JDBCWrapperFactory.getWrapper(JDBCWrapperFactory.java:175) at weblogic.jdbc.pool.Driver.allocateConnection(Driver.java:229) at weblogic.jdbc.pool.Driver.connect(Driver.java:157) at weblogic.servlet.internal.session.JDBCSessionData.getConnection(JDBCSessionData.java:184) at weblogic.servlet.internal.session.JDBCSessionData.getSessionIds(JDBCSessionData.java:128) at weblogic.servlet.internal.session.JDBCSessionContext.getIdsInternal(JDBCSessionContext.java:246) at weblogic.servlet.internal.session.SessionContext$SessionInvalidator.cleanupExpiredSessions(SessionContext.java:703) at weblogic.servlet.internal.session.SessionContext$SessionInvalidator$1.run(SessionContext.java:680) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:344) at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71) at weblogic.servlet.internal.session.SessionContext$SessionInvalidator.timerExpired(SessionContext.java:676) at weblogic.timers.internal.TimerImpl.run(TimerImpl.java:301) at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:677) at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352) at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337) at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:57) at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:651) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:420) at weblogic.work.ExecuteThread.run(ExecuteThread.java:360) Caused By: java.lang.ClassNotFoundException: weblogic.jdbc.wrapper.PoolConnection at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:398) at weblogic.utils.wrapper.WrapperFactory.getWrapperClass(WrapperFactory.java:219) at weblogic.utils.wrapper.WrapperFactory.getWrapperClass(WrapperFactory.java:190) at weblogic.jdbc.wrapper.JDBCWrapperFactory$1.run(JDBCWrapperFactory.java:178) at java.base/java.security.AccessController.doPrivileged(Native Method) at weblogic.jdbc.wrapper.JDBCWrapperFactory.getWrapper(JDBCWrapperFactory.java:175) at weblogic.jdbc.pool.Driver.allocateConnection(Driver.java:229) at weblogic.jdbc.pool.Driver.connect(Driver.java:157) at weblogic.servlet.internal.session.JDBCSessionData.getConnection(JDBCSessionData.java:184) at weblogic.servlet.internal.session.JDBCSessionData.getSessionIds(JDBCSessionData.java:128) at weblogic.servlet.internal.session.JDBCSessionContext.getIdsInternal(JDBCSessionContext.java:246) at weblogic.servlet.internal.session.SessionContext$SessionInvalidator.cleanupExpiredSessions(SessionContext.java:703) at weblogic.servlet.internal.session.SessionContext$SessionInvalidator$1.run(SessionContext.java:680) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:344) at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71) at weblogic.servlet.internal.session.SessionContext$SessionInvalidator.timerExpired(SessionContext.java:676) at weblogic.timers.internal.TimerImpl.run(TimerImpl.java:301) at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:677) at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352) at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337) at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:57) at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManagerImpl.java:651) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:420) at weblogic.work.ExecuteThread.run(ExecuteThread.java:360)
原因分析
- WebClassLoader类加载隔离机制:域
lib文件夹使用Application类加载器,无法访问WebLogic核心模块(modules目录)中的类,而weblogic.jdbc.wrapper.PoolConnection属于核心模块com.bea.core.datasource6.jar,因此在应用类加载器上下文下找不到该类。 - Oracle数据源无此问题,是因为WebLogic对Oracle JDBC有原生适配,默认使用Global类加载器(系统核心类加载器),可以正常访问核心模块类。
- 将
com.bea.core.datasource6.jar复制到域lib会导致类重复加载,引发类冲突,直接导致服务器启动失败。
解决方案
- 移除冲突jar包:立即删除域
lib文件夹中的com.bea.core.datasource6.jar,恢复服务器正常启动能力。 - 修改数据源类加载模式:
- 登录WebLogic管理控制台,定位到Postgres数据源的配置页面
- 切换至「Configuration -> Connection Pool」标签页
- 找到「Classloader Mode」选项,将其从默认的
Application修改为Global - 保存配置并激活更改
- 重启服务器:重启WebLogic AdminServer及受影响的Managed Server,让配置生效
- 验证功能:重新测试数据源的实际使用场景,确认
ClassNotFoundException异常不再出现
内容的提问来源于stack exchange,提问作者Sietse
相关产品推荐
相关产品推荐

