无法使用 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中