1
votes

Migration Java 11 - createConnectionBuilder () de PoolDataSourceImpl se heurte à createConnectionBuilder () de javax.sql.DataSource

J'essaye de migrer un projet de Java 8 vers Java 11, qui utilise ojdbc. J'utilise une classe qui étend PoolDataSourceImpl, qui implémente PooLDataSource, qui étend javax.sql.DataSource et en essayant de le construire avec maven, cela donne cette erreur:

Échec de la compilation [ERREUR] createConnectionBuilder () dans oracle.ucp.jdbc.PoolDataSourceImpl ne peut pas implémenter create ConnectionBuilder () dans javax.sql.DataSource [ERREUR] type de retour oracle.ucp.jdbc.UCPConnectionBuilder n'est pas compatible avec java.sql.ConnectionBuilder

Quelqu'un a-t-il des suggestions?


2 commentaires

Avez-vous déjà résolu ce problème?


Pour résoudre ce problème, Oracle devrait reconnaître cela comme un problème et créer une nouvelle version mineure du fichier JAR UCP avec cette correction.


3 Réponses :


0
votes

C'est une incompatibilité d'interface. javax.sql.DataSource définit un method

public UCPConnectionBuilder createConnectionBuilder()

Et selon le contrat, la valeur de retour doit être de type ConnectionBuilder.

Si vous regardez documentation de oracle.ucp.jdbc.PoolDataSourceImpl, il définit la méthode comme

default ConnectionBuilder createConnectionBuilder() throws SQLException

alors que oracle.ucp.jdbc.UCPConnectionBuilder n'est pas un sous-type de java.sql.ConnectionBuilder .

Maintenant, à moins qu'Oracle ne publie une version jamais de l'interface oracle.ucp.jdbc.UCPConnectionBuilder qui étend java.sql.ConnectionBuilder , vous ne pourrez pas pour échanger UCP PoolDataSource avec javax.sql.DataSource .

La dernière version à ce stade semble être UCP 19.3 , ce qui poserait toujours le même problème, ce qui est malheureux puisque la version 19.3 est annoncée comme compatible JDK11. Veuillez soulever un bogue contre Oracle UCP pour informer les responsables du nouveau venu createConnectionBuilder dans l'interface DataSource.

Dans l'intrim, si cela est possible, vous pouvez revenir à la version 11g 2 de UCP ( pas 12, pas 19) qui n'a pas la méthode createConnectionBuilder sur l'interface PoolDataSource. Ce n'est pas une situation idéale, car vous renoncez à une décennie d'améliorations de l'UCP en revenant à 11g.


3 commentaires

Avez-vous recompilé ou simplement basculé vers JDK 11?


Vous ne savez pas ce que vous entendez par cette question @Kuassi Mensah? Je suis confronté au problème en essayant de compiler avec JDK 11.


@ToddSharp Vous avez répondu à la question, c'est-à-dire recompilé l'application avec JDK 11.



0
votes

Le problème est que vous essayez de sous-classer PoolDataSourceImpl qui est une classe spécifique au fournisseur compilée avec JDK8 et que nous ne prenons pas en charge l'extension de nos classes sauf si nous suggérons explicitement de le faire, comme dans ce blog ; et cela est vrai pour tous les éditeurs de logiciels. En plus de cette restriction, nos pilotes (ojdbc8.jar, ucp.jar) sont compatibles avec les versions plus récentes de JDK (c'est-à-dire, fonctionnent avec JDK11) et les versions de base de données.


2 commentaires

L'extension est par pot UCP. Il est tout simplement malchanceux que la version 19 d'UCP ait introduit une nouvelle méthode createConnectionBuilder en même temps que JDK 10 introduisait exactement le même nom dans l'interface DataSource que PoolDataSource étend. Donc l'extension est d'Oracle.


C'est vrai. UCP implémente createConnectionBuilder qui renvoie un OracleConnectionBuilder. Dans Java 8, cette méthode est propriétaire d'Oracle mais dans Java 9, javax.sql.DataSource définit createConnectionBuilder renvoyant un java.sql.DataSource. Cela fonctionne bien dans Java 9 car oracle.jdbc.OracleConnectionBuilder étend java.sql.ConnectionBuilder dans ojdbc9 | 10 | 11.jar. Mais UCP est construit avec Java 8 et ojdbc8.jar donc cela ne fonctionne pas.



0
votes

Avec ce problème, le proxy avec un proxy basé sur l'interface sur PoolDataSource ne fonctionnera jamais. Un bogue est enregistré sur oracle ucp pour le même. J'ai même posté une requête de forum sans réponse sur ce https://community.oracle.com/thread/4325841 .


0 commentaires