Java au coeur de la base de données Oracle

La page est créée Caroline Herve
 
CONTINUER À LIRE
Java au coeur de la base de données Oracle
32          Tips&techniques

    Philippe Daucourt, HEG – Haute école de gestion Arc

    Java au cœur de la base de données
    Oracle

       Depuis la version 8i, Oracle
                                              Les manipulations que nous allons
    embarque une machine virtuelle         présenter dans cet article s’appliquent
    Java (JVM) au cœur de sa base de       à une base de données 11gR2 et se ba-
    données. Cette caractéristique         seront sur le code source Java suivant:
    encore mal connue des dévelop-
    peurs et peu répandue continue
                                             package ch.hegarc.helloworld;
    d’évoluer et la version 11g a
    apporté son lot de nouveautés et         public class Main {
                                                 public static void main(String[] args) {
    d’amélioration. Cet article revient              System.out.println(“Hello “+ args[0]+ “ !!!“);
                                                 }
    sur les fondamentaux de cette            }

    technologie que nous avons eue
    l’occasion de mettre en œuvre ré-
                                               Selon la tradition de Ritchie et Ker-
    cemment dans le cadre d’un projet      nighan, cette classe Java ne fait rien
    de recherche appliquée financé         d’autre que de récupérer la valeur
    par la Commission pour la techno-      passée en paramètre au moment de
    logie et l’innovation de la Confédé-   l’appel, de la concaténer à une chaîne
                                           de caractères puis d’afficher le résultat
    ration (CTI).
                                           sur la sortie standard du système.

                                               Malgré sa simplicité, ce bout de
                                           code Java pose un certain nombre de
                                                                                           Chargement de
                                           questions pour être exécuté par la base
                                           de données. Comment charger ce code             code Java dans la
                                           source dans la base de données? Com-            base de données
                                           ment compiler ce code source en code
                                           Java exécutable? Comment invoquer                   Pour commencer, nous allons voir
                                           ce traitement? Comment passer un pa-            une première méthode qui consiste
                                           ramètre au moment de l’appel? Com-              à charger le code source de la classe
                                           ment rediriger la sortie de Java vers           dans la base de données et à le com-
                                           celui de la base de données? C’est à            piler au moyen de l’instruction SQL sui-
                                           ces quelques questions que nous allons          vante:
                                           tenter de répondre dans la suite de cet
                                           article.

                                                      CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED „ch.hegarc.helloworld.Main“ AS
                                                      package ch.hegarc.helloworld;

                                                      public class Main {
                                                          public static void main(String[] args) {
                                                              System.out.println(“Hello “+ args[0]+ “ !!!“);
                                                          }
                                                      }

                                                                                               Cette instruction a pour effet de
                                                                                           créer un objet de type «Java Source»
                                                                                           ainsi qu’un objet de type «Java Class»
                                                                                           dans le schéma de l’utilisateur qui l’a
                                                                                           exécutée. Le nom indiqué entre «NA-
                                                                                           MED» et «AS» correspond au nom de
                                                                                           la source Java. Le nom de la classe

SOUG Newsletter 1/2012
Tips&techniques                               33

       A N Z E I G E

   5% Rabatt auf Oracle- und Oracle-Java-
   Seminare für SOUG-Mitglieder                                                                                    Drive your life.

Java correspond quant à elle comme                    Il s’agit bien ici de donner le nom de            Nous allons maintenant nous inté-
à l’accoutumée en Java à la combinai-             l’objet de type «Java Source». L’objet           resser à une seconde méthode pour
son du nom du paquetage et du nom                 correspondant à la classe compilée               charger du code Java dans la base de
de la classe. Bien que cela ne soit pas           sera quant à lui automatiquement sup-            données. Cette autre solution consiste
obligatoire, nous recommandons de                 primé.                                           à ne charger cette fois-ci que la classe
conserver le même nom pour ces deux                                                                compilée. Pour cela, nous allons recou-
objets.                                                                                            rir à un utilitaire en ligne de commande
                                                                                                   qui s’appelle «loadjava». La classe doit
    Une petite exploration des objets du                                                           avoir été compilée au préalable soit en
schéma de l’utilisateur nous confirme                                                              ligne de commande avec l’utilitaire «ja-
bien la présence de ces deux objets.                                                               vac» du Java Development Kit (JDK)
Nous constatons également que les «.»                                                              soit en passant par les services d’un
dans les noms de ces objets ont été rem-                                                           environnement de développement inté-
placés automatiquement par des «/».                                                                gré (IDE) comme NetBeans, Eclipse ou
                                                                                                   JDeveloper. Le code compilé doit corre-
                                                                                                   spondre à du bytecode Java 1.5.

                                                                                                       Voici la structure de la commande
                                                                                                   qui nous permet de charger notre clas-
                                                                                                   se dans le schéma de l’utilisateur:

                                                                                 loadjava -u user/password@host:port:sid -r -v -f Main.class

    Cette première technique de char-
gement permet de stocker le code
source de la classe Java dans la base                                                              ■
                                                                                                       L’option «-u» permet de spécifier un
de données ce qui nous évite de devoir                                                                 schéma cible.
le conserver dans un autre référentiel                                                             ■
                                                                                                       L’option «-r» permet de «résoudre»
externe.                                                                                               la classe avec le «resolver1» par
                                                                                                       défaut. Nous n’aborderons pas ce
    Néanmoins, cette solution comporte                                                                 concept dans le cadre de cet artic-
certaines limites puisque le compilateur                                                               le.
interne de la base de données ne sem-                                                              ■
                                                                                                       L’option «-v» permet d’activer le
ble pas toujours compatible à 100%                                                                     mode «verbose» qui affiche plus
avec la spécification Java. Nous avons                                                                 d’informations à l’écran.
par exemple constaté que celui-ci ac-                                                              ■
                                                                                                       L’option «-f» permet de forcer le
cepte certaines annotations («@Inheri-                                                                 chargement et d’écraser la classe
ted» et «@Retention») mais pas d’autres                                                                qui porterait le même nom dans le
(«@Override»). D’autre part, la base de                                                                schéma.
données ne supporte actuellement que                                                               ■
                                                                                                       «Main.class» correspond au nom
du code Java 1.5.                                                                                      du fichier se trouvant dans le ré-
                                                                                                       pertoire courant contenant le code
    La suppression de ces deux objets                                                                  compilé.
se fait au moyen de l’instruction SQL
suivante:

  DROP JAVA SOURCE “ch/hegarc/helloworld/Main“;

                                                  1
                                                      http://docs.oracle.com/cd/E11882_01/java.112/e10588/chtwo.htm#BABGJCAJ

                                                                                                                    SOUG Newsletter 1/2012
34           Tips&techniques

       Une petite exploration des objets du
    schéma de l’utilisateur nous confirme
                                                                                 loadjava -u user/password@host:port:sid -r -v -f HelloWorld.jar
    bien la présence d’un seul objet de type
    «Java Class» cette fois-ci.
                                                                                                            Une petite exploration des objets
                                                                                                         du schéma de l’utilisateur nous confir-
                                                                                                         me bien que le fichier JAR a été chargé
                                                                                                         puisqu’un objet de type «Java Class»
                                                                                                         y est présent. Nous constatons égale-
                                                                                                         ment la présence d’un deuxième objet
                                                                                                         de type «Java Resource» correspon-
                                                                                                         dant au fichier manifeste2 accompag-
                                                                                                         nant généralement un fichier JAR.

        Nous pouvons supprimer cette
    classe au moyen de l’instruction SQL
    suivante:

      DROP JAVA CLASS “ch/hegarc/helloworld/Main“;

       Il est également possible d’obtenir                                                                    Bien que cette solution permette
    le même résultat en utilisant l’utilitaire                                                           de charger facilement de nombreuses
    «dropjava» en ligne de commande:                                                                     classes regroupées au sein du même
                                                                                                         fichier JAR, elle présente le gros défaut
                                                                                                         de ne pas garder de lien entre celui-ci et
      dropjava -u user/password@host:port:sid -v Main.class
                                                                                                         les classes extraites. Par conséquent,
                                                                                                         il n’est pas possible de supprimer
        Dans ce cas, le fichier «Main.class»                                                             l’ensemble des classes d’un seul coup
    doit obligatoirement se trouver dans le                                                              et il faut le faire une à une.
    répertoire courant. Si on ne dispose plus
    de ce fichier, la seule possibilité pour le                                                              La deuxième variante consiste à
    supprimer de la base de données con-                                                                 charger le fichier JAR avec l’option
    siste alors à utiliser l’instruction SQL                                                             «-jarsasdbobjects». Si cette option est
    précédente.                                                                                          présente, la base de données va non
                                                                                                         seulement extraire et charger les clas-
         Finalement, nous allons voir main-                                                              ses du fichier JAR comme auparavant
    tenant une troisième méthode qui con-                                                                mais elle va également conserver le lien
    siste à charger le code Java dans la                                                                 entre celui-ci et les classes extraites.
    base de données au travers d’un fichier
    JAR (Java Archive). Nous allons passer                     loadjava -u user/password@host:port:sid -r -v -f -jarsasdbobjects HelloWorld.jar

    en revue les différentes variantes qui
    existent. Comme pour la deuxième mé-
    thode, la classe doit avoir été compilée                                                                 Désormais, il suffit de supprimer le
    et intégrée à un fichier JAR au préalable                                                            fichier JAR pour que toutes ses classes
    soit en ligne de commande avec les uti-                                                              soient également supprimées automati-
    litaires «javac» et «jar» du JDK soit en                                                             quement. A contrario, il n’est alors plus
    passant par les services d’un IDE.                                                                   possible de supprimer une classe de
                                                                                                         manière unitaire.
        La première variante consiste à
    charger le fichier JAR de manière stan-                                           dropjava -u user/password@host:port:sid -v HelloWorld.jar
    dard. Il suffit pour cela de remplacer
    dans la commande «loadjava» le nom
    du fichier de la classe par le nom du
    fichier JAR:

                                                     2
                                                         http://java.sun.com/developer/Books/javaprogramming/JAR/basics/manifest.html

SOUG Newsletter 1/2012
Tips&techniques                               35

    Cette commande ne fonctionne que                                                            utilisée, consiste à créer un «wrapper»
si le fichier «HelloWorld.jar» se trouve                                                        (une enveloppe) PL/SQL qui va servir
dans le répertoire courant. Si celui-                                                           de façade pour invoquer une opération
ci n’est plus disponible, il n’est alors                                                        d’une classe Java. Seules les méthodes
plus possible de supprimer les clas-                                                            statiques de la classe peuvent être en-
ses y relatif qui ont été extraites dans                                                        veloppées de cette manière.
le schéma. Il s’agira donc de conserver
précieusement dans un endroit sûr tous                      CREATE OR REPLACE PROCEDURE helloworldWrapper(pi_firstname IN VARCHAR2)
                                                              AS LANGUAGE JAVA NAME ‚ch.hegarc.helloworld.Main.main(java.lang.String[])‘;
les fichiers JAR chargés selon cette va-
riante.
                                                                                                   Dès lors, nous pouvons appeler ce
    La troisième et dernière variante                                                           wrapper comme toute autre procédure
consiste à charger le fichier JAR com-                                                          PL/SQL standard.
me une ressource Java. Si cette opti-
on est présente, la base de données va
charger le fichier JAR sans extraire ses
classes. Celles-ci seront toutefois ac-
cessibles, comme nous le verrons plus
loin dans cet article.

  loadjava -u user/password@host:port:sid -r -v -f -jarasresource HelloWorld.jar

                                                                                                    Il convient de noter que cette pos-
    Une petite exploration des objets du                                                        sibilité ne s’applique pas si nous avons
schéma de l’utilisateur nous confirme                                                           chargé le fichier JAR comme ressource
bien que le fichier JAR a été chargé cet-                                                       dans la base de données.
te fois-ci comme un objet de type «Java
Resource».                                                                                          Une deuxième possibilité qui nous
                                                                                                est offerte pour exécuter une classe Java
                                                                                                consiste à utiliser la fonction «RUNJA-
                                                                                                VA» du package «DBMS_JAVA». Cette
                                                                                                fonction permet d’exécuter des classes
                                                                                                Java plus ou moins comme nous le feri-
                                                                                                ons en ligne de commande de manière
                                                                                                classique hors de la base de données.

                                                                                                    «JSERVER_SCHEMA» est un mot-
                                                                                                clé qui indique que la classe doit se
                                                                                                trouver dans le schéma de l’utilisateur
Exécution de code                                                                               «JEANNERETL» dans notre cas. La
Java résidant dans                                                                              classe Java invoquée peut avoir été
la base de données                                                                              chargée dans la base de données de
                                                                                                manière individuelle ou au travers d’un
    Maintenant que nous avons vu diffé-                                                         fichier JAR (standard ou jarasdbob-
rentes méthodes pour charger une clas-                                                          jects).
se Java dans la base de données, il faut
nous intéresser à la façon de l’invoquer.                                                          L’exemple suivant ne fonctionne
A nouveau, nous allons passer en revue                                                          que si la classe Java se trouve dans
les différentes façons de procéder.                                                             un fichier JAR chargé comme une res-
                                                                                                source (jarasresource) dans la base de
     Afin de rediriger la sortie standard                                                       données.
du système Java (System.out) vers ce-
lui de la base de données, nous devons
utiliser la procédure «SET_OUTPUT» du
paquetage DBMS_JAVA. Celle-ci prend
en paramètre la taille du buffer pour gé-
rer la sortie.

    La première possibilité, qui est cer-
tainement la plus connue et la plus

                                                                                                                 SOUG Newsletter 1/2012
36          Tips&techniques

                                                                                           Conclusion
                                                                                               Pour conclure, nous venons de voir
                                                                                           différentes manières de charger des
                                                                                           classes Java dans la base de données
                                                                                           Oracle et de les invoquer. Nous revien-
                                                                                           drons prochainement dans un autre
                                                                                           article sur des concepts plus avancés
                                                                                           ainsi que sur des cas d’utilisation de
                                                                                           cette technologie peu connue. ■

         «JSERVER_CP/RESOURCE/SCHE-           shell de commandes qui permet, une
     MA» est un mot-clé qui indique que le    fois connecté à un schéma, d’exécuter
     fichier JAR est une ressource du sché-   les classes Java qui y résident comme
     ma «JEANNERETL» dans notre cas.          nous le ferions en ligne de commande
                                              de manière classique hors de la base de
         Enfin, il existe une troisième et    données.
     dernière possibilité pour exécuter une
     classe Java qui consiste à faire appel
     en ligne de commande à la comman-        ojvmjava -user user/password@host:port:sid
     de «ojvmjava». Ce programme est un
                                                                                             Contact

                                                                                             HEG – Haute école de gestion Arc

                                                                                             Philippe Daucourt
                                                                                             E-Mail:
                                                                                             Philippe.Daucourt@he-arc.ch

    SMS     >>>

               Studie von Oracle und PwC:
               Telko-CIOs wollen ihre IT 2012 besser ausnutzen
              16. November 2011. In Kooperation mit PwC,                 sie darauf reagieren, indem sie verstärkt auf
              einer der führenden Wirtschaftsprüfungs-                   Outsourcing und Standardisierung setzen.
              und Beratungsgesellschaften, hat Oracle                    88 Prozent der an der Umfrage beteilig-
              die IT-Prioritäten von Telekommunikations-                 ten CIOs planen für 2012 ein Upgrade ihrer
              unternehmen in Europa untersucht. Der                      CRM-Systeme. Auf diese Weise können sie
              Studie zufolge entfallen bei 60 Prozent der                sich stärker auf strategische Anwendungen
              befragten CIOs derzeit mehr als die Hälfte                 und Umsatzfaktoren, wie Portal oder Con-
              der Betriebskosten auf Wartung. 2012 wollen                tent Applications, konzentrieren.

              Die ganze Studie: http://www.oracle.com/us/dm/oracle-it-survey-report-401679.pdf

SOUG Newsletter 1/2012
Vous pouvez aussi lire