2017-03-21 3 views
0

J'essaye d'instrumenter mes connexions jdbc. Je sais qu'il y a plusieurs questions similaires à ce sujet.

J'ai tout essayé, mais je n'ai pas trouvé le moyen de résoudre ce problème. également essayé les réponses à cette question, sans résultat: Apache Commons DBCP connection object problem, Thread: ClassCastException in org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

Je travaille avec Tomcat 7 et Java 7. Voici où je définir le pool de connexion oracle dans mon context.xml:

<Resource name="jdbc/myDS" 
     type="javax.sql.DataSource" 
     auth="Container" 
     maxActive="350" 
     maxIdle="50" 
     minIdle="10" 
     maxWait="10000" 
     username="user_own" 
     password="mypassw" 
     accessToUnderlyingConnectionAllowed="true" 
     driverClassName="oracle.jdbc.driver.OracleDriver" 
     url="jdbc:oracle:thin:@192.168.110.173:1521/orcl" /> 

Mon code d'instrumentation:

private static void initInstrumentation(Connection con, final String usuario, final String modulo, final String accion) throws Exception { 

    if (IncVariablesPlx.getParameter("instrumentation.active").equals("1")) { 

     try { 

      OracleConnection oracleConnection = null; 
      //This is where I try to get the oracle connection, but no succeed 
      if (con != null) { 

       if (con instanceof OracleConnection) {//NEVER COME IN HERE 
        oracleConnection = (OracleConnection) con; 
       } else if (con.isWrapperFor(OracleConnection.class)) {//NEVER COME IN HERE 
        oracleConnection = con.unwrap(OracleConnection.class); 
       } else{ 
        //NO ORACLECONNECTION NO isWrapperFor -> ALWAYS ENDS HERE!!! 
        //oracleConnection = (OracleConnection) ((DelegatingConnection) con).getDelegate(); 
        oracleConnection = (OracleConnection) new DelegatingConnection(con).getInnermostDelegate(); 
       } 
      } 

      if (oracleConnection != null) { 
       String[] metrics = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX]; 
       metrics[OracleConnection.END_TO_END_MODULE_INDEX] = modulo; 
       metrics[OracleConnection.END_TO_END_ACTION_INDEX] = "Inicio: " + accion; 
       metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = usuario; 

       oracleConnection.setEndToEndMetrics(metrics, (short) 0); 
      } 

     } catch (Exception e) { 
      throw new Exception("Error initInstrumentation " + e); 
     } 
    } 
} 

Ma méthode de connexion ouverte:

private static Connection genericOpenConnection() throws Exception { 
    Connection con = null; 
    try { 

     DataSource dataSource = (DataSource) new InitialContext().lookup(IncFuncionesPlx.cStrPlx(IncVariablesPlx.getParameter("dataSourceJndiName"))); 
     con = dataSource.getConnection(); 
     con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); 

    } catch (Exception e) { 
     Error.escribeLog("Error : " + e.getMessage()); 
     throw new SQLException(e.getMessage()); 
    } 
    return con; 
} 

Après avoir appelé openConnection et initInstrumentation, j'obtiens l'exception suivante en essayant de convertir la connexion en une connexion oracle. Des idées de comment faire cela? Qu'est-ce que je me trompe? Merci d'avance.

java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource $ PoolGuardConnectionWrapper ne peut pas être jeté à oracle.jdbc.OracleConnection

+0

@ mark-Rotteveel Il est pas reproduit, je l'ai lu et tout essayé, inclus la question que vous avez dit c'est un doublon ... – elcadro

+0

Avez-vous essayé d'appeler 'getInnermostDelegate'? –

+0

oui, j'ai essayé ça aussi ... – elcadro

Répondre

1

J'ai trouvé mon problème. J'espère que cela peut aider n'importe qui avec le même problème.

La chose semble être liée à un conflit avec les bibliothèques de pilotes ojdbc. J'ai un pilote dans mon tomcat, et un autre dans pom.xml via maven.

<!-- Driver oracle --> 
<dependency> 
    <groupId>com.plexus</groupId> 
    <artifactId>ojdbc6</artifactId> 
    <version>11.2.0</version> 
    <scope>provided</scope> 
</dependency> 

Déclarant ce pilote comme prévu fixe mon problème, et la connexion est maintenant été récupérée comme décrit ci-dessous

if (con.isWrapperFor(OracleConnection.class)) { 
     oracleConnection = con.unwrap(OracleConnection.class); 
}