无法使用 JAVA1.8 和 Tomcat 8.5.28 从 ConnectionWrapper 转换为 oracle.jdbc.OracleConnection

Posted

技术标签:

【中文标题】无法使用 JAVA1.8 和 Tomcat 8.5.28 从 ConnectionWrapper 转换为 oracle.jdbc.OracleConnection【英文标题】:Cannot cast from ConnectionWrapper to oracle.jdbc.OracleConnection using JAVA1.8 and Tomcat 8.5.28 【发布时间】:2018-09-04 07:44:49 【问题描述】:

为什么几秒钟后连接不工作?应用程序挂起且未按预期运行并返回以下错误。

java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 无法转换为 org.apache.tomcat.dbcp.dbcp2.DelegatingConnection

以下是用于获取连接的代码:

OracleConnection oracleConnection = (OracleConnection) 
((DelegatingConnection)connection).getInnermostDelegate();

使用库:commons-pool1.6.jar 用于加密,tomcat-dbcp.jar 用于数据库。

在 Tomcat context.xml 中使用加密的用户名和密码。

另外,在 context.xml 文件中使用 accessToUnderlyingConnectionAllowed=true。

问题在于 JAVA8 和 Tomcat8。能够使用普通凭据正常工作,唯一的问题是加密凭据。

【问题讨论】:

您是否应该使用connection.unwrap(OracleConnection.class); 而不是您现在拥有的?您使用的是 Tomcat8,我假设您使用的是提供 JDBC 4 的最新 Java 版本。 感谢您的建议。也试过这个解包,但没有用。我们使用的是 JAVA1.8、Tomcat 8.5.28 和 ojdbc7.jar。 @MaheshReddy 你找到解决方案了吗?我面临同样的问题。在 n 号之后无法建立连接。点击次数。 【参考方案1】:

您不应该进行强制转换或展开。在 Tomcat 'conf/context.xml' 文件中使用正确的数据源类型。对于 Oracle,它是:oracle.jdbc.pool.OracleDataSource。 设置正确的驱动程序和工厂。 看看我的这个例子:

<Context>

<!-- Default set of monitored resources. If one of these changes, the    -->
<!-- web application will be reloaded.                                   -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>$catalina.base/conf/web.xml</WatchedResource>

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Resource name="UNCUNC"
          auth="Container"
          type="oracle.jdbc.pool.OracleDataSource"
          factory="oracle.jdbc.pool.OracleDataSourceFactory"
          driverClassName="oracle.jdbc.OracleDriver"

          url="jdbc:oracle:thin:@p260unc4.big.ru:1566:uncunc"
          user="dsserv"
          password="dsservPass" 

          connectionProperties="SetBigStringTryClob=true"
          maxTotal="20" maxIdle="10"
          maxWaitMillis="-1"/>              
<JarScanner scanManifest="false"/>

稍后在java代码中这样使用它(不要强制转换):

try 
        Context initContext = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        DataSource ds = (DataSource)envContext.lookup("UNCUNC");
     catch (NamingException e) 
        logger.error("DATASOURCE error", e);
    
 Connection conn = ds.getConnection();

应该可以正常工作。请注意,在不同版本的 Tomcat 中,您需要使用“用户名”而不是“用户”字段。

【讨论】:

【参考方案2】:

我遇到了同样的问题。经过大量分析后意识到这是类加载问题。通过在 shared.loaded 中(在 conf/catalina.properties 中)提供 ojdbc jar 修复了该问题

shared.loader="/path/to/ojdbcN_jar/ojdbcN.jar"

这将确保 OracleConnection 类是从 Tomcat 和部署的 webapp 中的同一个 jar 加载的。

在需要 OracleConnection 的应用程序中,使用以下:

OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);

注意:在我的应用程序中,我有 ojdbc jar,以便我的应用程序可以正常编译,但是在部署时,使用的 jar 将是共享加载程序中提到的那个。

另外不要忘记在创建Tomcat JDBC连接池的时候开启accessToUnderlyingConnectionAllowed

【讨论】:

以上是关于无法使用 JAVA1.8 和 Tomcat 8.5.28 从 ConnectionWrapper 转换为 oracle.jdbc.OracleConnection的主要内容,如果未能解决你的问题,请参考以下文章

使用.keystore文件使用tomcat 8.5配置SSL - 无法存储非私钥

linux ubuntu-16.04-配置java1.8和Tomcat8

MyEclipse 8.5 中加载的Tomcat 6.0 无法启动?

使用war将spring-boot和angular 7应用程序部署到tomcat 8.5中

用于嵌入式 Tomcat 8.5 的 Tomcat Maven 插件

亚马逊 linux + java 1.8 + tomcat8 错误