无法使用JAVA1.8和Tomcat 8.5.28从ConnectionWrapper投射到oracle.jdbc.OracleConnection

时间:2018-09-04 07:44:50

标签: java tomcat8

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

  

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有关。能够使用普通凭证正常工作,唯一的问题是使用加密凭证。

2 个答案:

答案 0 :(得分:0)

您不应该进行投射或展开。在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中,您需要使用“用户名”而不是“用户”字段。

答案 1 :(得分:0)

我遇到了同样的问题。经过大量分析,发现这是类加载问题。通过在shared.loaded(在conf / catalina.properties中)中提供ojdbc jar来解决此问题。

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

这将确保从Tomcat和部署的Web应用程序中的同一jar中加载OracleConnection类。

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

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

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

也不要忘记在创建Tomcat JDBC连接池时启用accessToUnderlyingConnectionAllowed