2017-07-21 3 views
0

Dans un environnement Tomcat 8.5.15 utilisant une base de données Oracle 11, je souhaite implémenter une source de données qui gère les mots de passe chiffrés dans context.xml. J'ai des problèmes avec cela, comme décrit dans ce StackOverflow question.Pourquoi ComboPooledDataSource de C3p0 se connecte-t-il correctement à une base de données, mais pas son clone?

Dans l'espoir de déterminer le problème sous-jacent, j'ai simplifié le scénario. Premièrement, j'ai vérifié que la spécification de ressource C3p0 fonctionnait correctement.

<Resource 
       auth="Container" 
       description="MyDataSource" 
       driverClass="oracle.jdbc.OracleDriver" 
       maxPoolSize="100" 
       minPoolSize="10" 
       acquireIncrement="1" 
       name="jdbc/MyDataSource" 
       user="me" 
       password="mypassword" 
       factory="org.apache.naming.factory.BeanFactory" 
       type="com.mchange.v2.c3p0.ComboPooledDataSource" 
       jdbcUrl="jdbc:oracle:thin:@mydb:1521:dev12c" 
       /> 

Cela a bien fonctionné. Ensuite, j'ai créé un clone du ComboPooledDataSource, sur la base décompilation du fichier de classe:

public final class ComboPooledDataSourceCopy 
     extends AbstractComboPooledDataSource 
     implements Serializable, Referenceable { 
    private static final long serialVersionUID = 1L; 
    private static final short VERSION = 2; 

    public ComboPooledDataSourceCopy() { 
    } 

    public ComboPooledDataSourceCopy(boolean autoregister) { 
     super(autoregister); 
    } 

    public ComboPooledDataSourceCopy(String configName) { 
     super(configName); 
    } 

    private void writeObject(ObjectOutputStream oos) throws IOException { 
     oos.writeShort(2); 
    } 

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { 
     short version = ois.readShort(); 
     switch(version) { 
      case 2: 
       return; 
      default: 
       throw new IOException("Unsupported Serialized Version: " + version); 
     } 
    } 
} 

J'ai créé une spécification révisée des ressources en utilisant la classe cloné:

<Resource 
       auth="Container" 
       description="MyDataSource" 
       driverClass="oracle.jdbc.OracleDriver" 
       maxPoolSize="100" 
       minPoolSize="10" 
       acquireIncrement="1" 
       name="jdbc/MyDataSource" 
       user="me" 
       password="mypassword" 
       factory="org.apache.naming.factory.BeanFactory" 
       type=type="com.mycompany.ComboPooledDataSourceCopy" 
       jdbcUrl="jdbc:oracle:thin:@mydb:1521:dev12c" 
       /> 

Lorsque je tente de se connecter à la base de données En utilisant cette spécification, la tentative de connexion échoue.

... 
Caused by: java.sql.SQLException: [email protected] 
[wrapping: [email protected]] 
is not a wrapper for or implementation of oracle.jdbc.OracleConnection 
    at com.mchange.v2.c3p0.impl.NewProxyConnection.unwrap(NewProxyConnection.java:1744) 
    at org.jaffa.security.JDBCSecurityPlugin.executeStoredProcedure(JDBCSecurityPlugin.java:117) 
    ... 67 more 

Pourquoi la tentative de clonage ne parvient-elle pas à se connecter?

MISE À JOUR:

Avec l'aide de notre DBA local, nous avons été en mesure de vérifier mes tentatives de connexion. Il semble que nous réussissions à nous connecter à la base de données et à nous connecter. Sur cette base, il semble que le problème réside peut-être dans la manière dont le code gère la réponse de la base de données plutôt que dans la génération de requêtes.

Répondre

1

L'erreur résultait d'un problème de chargement de classe, dans lequel les classes Oracle étaient chargées à partir de plusieurs fichiers jar (%CATALINA_HOME%\lib\ojdbc7-12.1.0.2.0.jar et %CATALINA_HOME%\webapps\my-webapp-1.0.0\WEB-INF\lib\ojdbc7-12.1.0.2.0.jar) par différents chargeurs de classe. Quand j'ai supprimé %CATALINA_HOME%\webapps\my-webapp-1.0.0\WEB-INF\lib\ojdbc7-12.1.0.2.0.jar, mon problème est parti.

Ces sources (1, 2, 3) en traitent plus en détail.