java - maxtotal - org.apache.commons.dbcp.basicdatasource maven
Problema de objeto de conexión DBCP de Apache Commons, Subproceso: ClassCastException en org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper (10)
De manera predeterminada, DBCP no permite el acceso a la instancia de conexión de base de datos subyacente "real", por lo que no puede acceder a la clase Oracle.
Al configuring el grupo, puede establecer
accessToUnderlyingConnectionAllowed = true
y luego funciona
El valor predeterminado es falso, es una operación potencial peligrosa y los programas que se portan mal pueden hacer cosas perjudiciales. (cierre el subyacente o continúe usándolo cuando la conexión protegida ya esté cerrada) Tenga cuidado y solo use cuando necesite acceso directo a extensiones específicas del controlador
NOTA: No cierre la conexión subyacente, solo la original.
Estoy usando el commons-dbcp.jar
conexiones de Apache Commons DBCP ( commons-dbcp.jar
).
Una vez que obtuve una conexión del grupo, se org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
en la clase org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
.
Mi requisito es pasar una matriz de Cadenas al procedimiento almacenado pl / sql en Oracle.
Esto es lo que estoy haciendo en el siguiente fragmento de código:
Connection dbConn = ConnectionManager.ds.getConnection();
//The above statement returns me an connection wrapped in the class
//org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.
org.apache.commons.dbcp.DelegatingConnection del = new org.apache.commons.dbcp.DelegatingConnection(dbConn.getConnection());
con = del.getInnermostDelegate();
cs = con.prepareCall("call SP_NAME(?,?,?,?)");
oracle.sql.ArrayDescriptor arDesc= oracle.sql.ArrayDescriptor.createDescriptor("ARRAY_NAME", (OracleConnection) con);
CallableStatement c_stmt = conn.prepareCall("begin update_message_ids_ota
(:x); end;" );
c_stmt.setArray( 1, array_to_pass );
c_stmt.execute();
Al ejecutar el código anterior, obtengo la siguiente excepción:
java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper no se puede convertir a oracle.jdbc.OracleConnection en oracle.sql.ArrayDescriptor.createDescriptor
Traté de encontrar una solución a lo largo de casi todos los sitios y foros, pero no pude obtener la respuesta o solución satisfecha sobre la misma.
Estoy planteando esto aquí para asegurarme de que cualquier persona que busque consejos sabe acerca de la solución definitiva para esto:
Si se ve obligado a usar la versión no empaquetada del administrador de persistencia (porque un repositorio antiguo todavía usa esa estructura que es incompatible con el diseño incluido), aquí lo que puede hacer, la solución es bastante simple:
Descargue las fuentes de Jackrabbit Core (puede obtenerlas del sitio web de Jackrabbit). Abra la clase OraclePersistenceManager y busque la siguiente línea de código:
Object blob = createTemporary.invoke(null,
new Object[]{con, Boolean.FALSE, durationSessionConstant});
(Alrededor de la línea 377 - también se puede verificar el StackTrace para referencia)
ConnectionFactory contiene un método estático que permite desplegar una conexión que es exactamente lo que necesita:
Object blob = createTemporary.invoke(null,
new Object[]{org.apache.jackrabbit.core.util.db.ConnectionFactory
.unwrap(con), Boolean.FALSE, durationSessionConstant});
Necesitará Maven 2+ para compilar las fuentes, lo hice y no tuve problemas de dependencia, tenga en cuenta que compilé la versión 2.2.10 de Jackrabbit.
También me aseguré de registrar un error contra Jackrabbit 2.2.11 (versión actual que todavía tiene el problema): https://issues.apache.org/jira/browse/JCR-3262
¡Espero que esto ayude!
Estoy trabajando con Tomcat 8.5.8 y estaba enfrentando este problema.
La siguiente solución funcionó como el encanto.
El código:
Delegating Connection delegate_conn = new Delegating Connection(connection)
conn = delegate_conn.getInnermostDelegate();
oracle.sql.ArrayDescriptor desc = oracle.sql.ArrayDescriptor.createDescriptor("TABLE_VIEW", conn);
La solución:
Agregar dependencia para tomcat-dbcp 8.5.8
y agregar el mismo jar en la carpeta lib de tomcat.
Parece que tomcat tiene diferentes jar para diferentes versiones a partir de 7.0 (referencia: https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-dbcp ).
Espero que ayude a alguien.
Hmmm, he encontrado la misma solución que tú. Creo que hay dos posiciones que necesitas mencionar. 1.Config Conjunto de grupo de conexiones accessToUnderlyingConnectionAllowed = "true"; 2. La pesadilla relacionada con el proyecto de código abierto. La concertación terrable. En este caso, eso es
org.apache.commons.dbcp.DelegatingConnection
no es igual a
org.apache.tomcat.dbcp.dbcp.DelegatingConnection
mientras que por defecto apache common-dbcp.jar, nunca encontrarás la siguiente clase. Pero solo la clase es la clave. Entonces, debemos encontrar la Clase en algún lado. Finalmente encuentro el paquete tomcat-dbcp .jar. Puede obtenerlo en http://www.docjar.com/ Después
import org.apache.tomcat.dbcp.dbcp.DelegatingConnection
, puedes forzar a lanzar dbConn y obtener la conexión subyacente
oracle.jdbc.driver.OracleConnection delConn =
(oracle.jdbc.driver.OracleConnection)
((org.apache.tomcat.dbcp.dbcp.DelegatingConnection)c_stmt.getConnection()).getDelegate();
Entonces podemos usar delConn para obtener el ArrayDescriptor. Recuerde una cosa, allí, no necesitamos el
org.apache.commons.dbcp.DelegatingConnection Class
Es algo muy extraño, pero es un trabajo real para el caso.
Me encontré con el mismo problema. Estábamos usando la primavera y tiene una clase llamada NativeJdbcExtractor. Tiene muchas implementaciones y la siguiente funciona para TomCat. Hay implementaciones específicas para Websphere, servidores de aplicaciones Weblogic.
<bean id="jdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"></bean>
En tu DAO puedes inyectar el frijol y usar el siguiente método
protected NativeJdbcExtractor jdbcExtractor;
Connection conn=jdbcExtractor.getNativeConnection(oracleConnection);
Para cualquier otra persona que esté buscando, getDelegate()
y getInnermostDelegate()
devuelven NULL
en mi código. Sin embargo, del depurador encontré OracleConnection como a continuación. Usamos Spring JdbcTemplate en toda la aplicación, que tiene la fuente de datos inyectada. Estamos en spring-jdbc-4.1.5.RELEASE.jar y ojdbc6.jar.
Connection conn = getJdbcTemplate().getDataSource().getConnection();
OracleConnection oracleConnection = ( OracleConnection ) conn.getMetaData().getConnection();
Si está utilizando una conexión JDBC compatible con Java 6, puede usar un código como el siguiente:
OracleConnection oracleConnection = null;
try {
if (connection.isWrapperFor(OracleConnection.class)) {
oracleConnection = connection.unwrap(OracleConnection.class);
}
} catch (SQLException ex) {
// do something
}
return oracleConnection;
A partir de este momento, use oracleConnection
lugar de la connection
original.
Ver http://docs.oracle.com/javase/6/docs/api/java/sql/Wrapper.html
Utilizamos matrices en nuestras llamadas a Oracle almacenados procs y usamos API propietaria de Oracle para crear matrices. Este pequeño cheque nos solucionó el problema cuando usamos la funcionalidad de aplicaciones independientes que usan commons-dbcp.
if (conn instanceof org.apache.commons.dbcp.DelegatingConnection)
{
log.debug("detected apache commons dbcp datasource");
conn = ((org.apache.commons.dbcp.DelegatingConnection) conn).getInnermostDelegate();
}
Sin embargo, necesitará commons-dbcp en classpath / dependencias.
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
Visto este post, puedo obtener OracleConnection con este código:
DataSource ds1 = // get the org.apache.commons.dbcp.PoolingDataSource
org.apache.tomcat.dbcp.dbcp.DelegatingConnection del = new org.apache.tomcat.dbcp.dbcp.DelegatingConnection(cds1.getConnection());
OracleConnection con = (OracleConnection) del.getInnermostDelegate();
recordar el commons-dbcp-1.4.jar neet para estar en la ruta de la clase
en su definición de contexto, agregue las etiquetas siguientes a su definición xml existente.
factory="oracle.jdbc.pool.OracleDataSourceFactory
scope="Shareable"
type="oracle.jdbc.pool.OracleDataSource"
.