Cannot cast from ConnectionWrapper to oracle.jdbc.OracleConnection using JAVA1.8 and Tomcat 8.5.28

北慕城南 提交于 2020-01-17 02:19:26

问题


Why connection is not working after few seconds? Application is hanging up and not running as expected and returning the below error.

java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to org.apache.tomcat.dbcp.dbcp2.DelegatingConnection

Below is the code that is used to get the connection:

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

using libraries: commons-pool1.6.jar for encryption & tomcat-dbcp.jar for database.

Using encrypted username and password in Tomcat context.xml.

Also, using accessToUnderlyingConnectionAllowed=true in context.xml file.

Issue is with JAVA8 and Tomcat8. Able to work properly with plain credentials, the only issue happens with encrypted credentials.


回答1:


You shouldn't do casting or unwrapping. Use correct DataSource type in Tomcat 'conf/context.xml' file. In case of Oracle it is: oracle.jdbc.pool.OracleDataSource. Set also correct driver and factory. Look at this example of mine:

<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"/>

Later in the java code use it like this (don't cast):

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();

Should work just fine. Take attention in different versions of Tomcat you need to use 'username' instead 'user' field.



来源:https://stackoverflow.com/questions/52161264/cannot-cast-from-connectionwrapper-to-oracle-jdbc-oracleconnection-using-java1-8

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!