为什么几秒钟后连接不起作用?应用程序已挂起,未按预期运行,并返回以下错误。
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有关。能够使用普通凭证正常工作,唯一的问题是使用加密凭证。
答案 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