IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Oracle lance une nouvelle tentative pour intégrer la modularité à Java


Sujet :

Java

  1. #41
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    @Namek
    C'est bien le problème de SQL, parfois t'es obligé de "lire" plusieurs fois la même table. Les optimiseurs sont parfois intelligents et ils ne sont pas plusieurs passent mais généralement ils appliquent bêtement l'algorithme.
    Par ailleurs, les requêtes sont souvent construites de manière séquentielle, je veux tel information, puis tel autre. Au final, j'ai l'impression que le langage est mauvais en tout.
    Je préfère les algos d'appareillage de fichier que l'on trouve dans les batchs COBOL.
    Oui, parfois il faut lire la même table plus d'une fois, exercice-type : employé/manager qui se trouvent dans la même table. Mais on reste dans un niveau logique.

    Les optimiseurs n'existent pas que dans les SGBD, si la requête est mal écrite, on risque d'en subir les conséquence. Si en Java on choisit les mauvaises structures (LinkedList/ArrayList, Vector ?), on aura le même problème.

    Séquentiel... SQL possède un "paradigme" proche du fonctionnel je trouve (à la manière de LISP, sans les jointures). Pour moi c'est le langage le plus évolué en terme de récupération de donnée, je ne connais nul autre langage qui permet de récupérer les données avec une meilleure granularité.

    Pour moi l'utilisation actuelle de COBOL est similaire au T-SQL, PL/SQL...
    COBOL sans SQL (j'entends par la DB2 IBM), ça ne sert pas à grand chose.
    La seule raison pour laquelle les gens continuent sur ces technos c'est soit parce qu'ils y sont contraints (COBOL & Mainframe), soit parce qu'ils ne connaissent pas autre chose que les outils internes aux SGBDR (T-SQL, PL/SQL). Mais bon dans certains cas l'utilisation de T-SQL et PL/SQL sont très utiles.

    Le must pour moi serait d'avoir du SQL standard en Java, comme pour PowerBuilder... ou le COBOL.



    @Namek
    Je connais bien Oracle, un peu SQL Server et MySQL mais pas du tout PostgreSQL. Mais de ce que j'ai pu voir PostgreSQL ressemble beaucoup à Oracle que ce soit en syntaxe ou en fonctionnalité. Mais pour les autres, ca n'a rien à voir ; dès que l'on touche à quelque chose d'un peu complexe/optimisé c'est même pas la peine ...
    Je ne suis pas sur que les utilisateurs de SGBDR outil open source vont apprécier...



    @Namek
    Et quid des "super package", ca ressemble à quoi au final ?
    A part l'article en 2007 de adiGuba...
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  2. #42
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Pour en revenir au sujet, a-t-on des nouvelles de ce nouveau Jigsaw ? Et quel est son objectif par rapport à OSGi (en dehors de la modularisation de la JVM) ?
    Je n'ai plus trop suivi le projet, mais il y a plein d'info ici : http://openjdk.java.net/projects/jigsaw/
    Reste à voir comment ça va évoluer d'ici là et si tout est toujours d'actualité...

    Citation Envoyé par Nemek Voir le message
    Modulariser la JVM pourrait commencer par splitter "rt.jar", créer une unité physique serait déjà un bon début.
    Ce sera déjà en partie le cas dans Java 8, où il y a déjà eu un gros travail pour casser certaines dépendances entre des APIs...

    De plus la JEP 161 introduit une notion de profile "compact" avec un set limité d'API.
    Certaines JVM pourront ainsi se limiter à ces profiles (pour de l'embarqué par exemple).

    Grosso modo on peut dire qu'il y a 4 profiles :
    • compact1 qui comporte le "strict minimum" pour faire tourner bon nombre d'application Java (java.lang, java.math, java.util, java.io, java.nio, java.time, javax.net, javax.crypto, javax.security, ...)
    • compact1 qui rajoutent la gestion de RMI, SQL et XML (java.rmi,java(x).sql, java.xml, org.xml, ...)
    • compact3 enrichie cela de divers APIs moins courante (java.lang.instrument, java.lang.management, javax.annotation.processing, java.lang.model, javax.management, javax.naming, ...).
    • Enfin tout le reste nécessitera un JRE "complet" (AWT/Swing, Applet, CORBA, ...)



    Il y a également dans Java 8 un outils jdeps permettant de lister les dépendances d'un jar envers d'autres jars ou ces différents profils...



    Citation Envoyé par Nemek Voir le message
    Et quid des "super package", ca ressemble à quoi au final ?
    Ils appellent cela des modules, et cela remplacera les simples jar.

    Grosso-modo pour faire un module il faudra ajouter un fichier "module-info.java" qui contiendra la déclaration du module, où l'on pourra définir les dépendances, l'export des classes & services ou encore le point d'entrée pour une application...
    On peut en avoir un aperçu rapide ici : http://cr.openjdk.java.net/~mr/jigsa...big-picture-01


    a++

  3. #43
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : août 2005
    Messages : 2 894
    Points : 7 197
    Points
    7 197
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Oui, parfois il faut lire la même table plus d'une fois, exercice-type : employé/manager qui se trouvent dans la même table. Mais on reste dans un niveau logique.
    Parfois ca n'a rien à avoir avec l'organisation logique, exemple tout bête, supprimer des éléménts sans correspondance :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DELETE FROM MATABLE A
    WHERE
      A.ID IN (
        SELECT B.ID FROM MATABLE B
    	  MINUS
    	SELECT C.ID FROM REFERENTIEL C
      );
    Là l'exemple est simple mais les choses se corsent dès que tu ajoutes des colonnes et la gestion du NULL :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DELETE FROM MATABLE A
    WHERE
      (A.CLE1,NVL(A.CLE2,'MY_FOO_BAR_MAGIC_STRING')) IN (
        SELECT D.CLE1,NVL(D.CLE2,'MY_FOO_BAR_MAGIC_STRING')
    	FROM (
          SELECT B.CLE1,B.CLE2 FROM MATABLE B
    	    MINUS
    	  SELECT C.CLE1,C.CLE2 FROM REFERENTIEL C
    	) D
      );
    J'ose même pas demander le plan d'execution ...

    Dans le même genre, la mise à jour d'une table à partir d'un référentiel.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE MATABLE A
    SET A.INFO=(SELECT B.INFO FROM REFERENTIEL B WHERE B.ID=A.ID)
    WHERE
      A.ID IN (SELECT C.ID FROM REFERENTIEL C WHERE C.ID=A.ID);

    Et on reste dans le domaine du "simple".

    Citation Envoyé par Gugelhupf Voir le message
    Les optimiseurs n'existent pas que dans les SGBD, si la requête est mal écrite, on risque d'en subir les conséquence. Si en Java on choisit les mauvaises structures (LinkedList/ArrayList, Vector ?), on aura le même problème.
    Je parle bien sûr des cas où c'est bien fait, un truc pourri reste un truc pourri. Ce que je reproche justement à SQL, c'est d'abstraire complètement la structure. C'est un langage déclaratif, c'est l'optimiseur qui choisit comment l'exécuter sauf qu'il arrive qu'il se vautre complètement ou qu'il se repose sur comment tu as écrit ta requête. Enfin je parle surtout avec l'expérience d'Oracle. L'avantage de ce dernier c'est la possibilité d'utiliser des HINT mais ca enlève de la portabilité et ca rend finalement le langage procédurale.

    Citation Envoyé par Gugelhupf Voir le message
    Séquentiel... SQL possède un "paradigme" proche du fonctionnel je trouve (à la manière de LISP, sans les jointures). Pour moi c'est le langage le plus évolué en terme de récupération de donnée, je ne connais nul autre langage qui permet de récupérer les données avec une meilleure granularité.
    Tout à fait d'accord sur le rapprochement avec le fonctionnel. D'ailleurs ca m'arrive de faire ce pont pour expliquer comment penser en SQL.

    Citation Envoyé par Gugelhupf Voir le message
    Pour moi l'utilisation actuelle de COBOL est similaire au T-SQL, PL/SQL...
    COBOL sans SQL (j'entends par la DB2 IBM), ça ne sert pas à grand chose.
    Les fichiers séquentiels simples ou bien ordonnés, sont énormément plus rapide à traiter qu'une base de données avec ces changements de contexte. J'aimerais un langage plus procédurale que SQL qui me permettrait d'organiser mes flux de données comme si les tables/indexes n'étaient que des collections d'enregistrement. C'est pour cela que j'aime bien les solutions NoSQL, leurs langages de requêtes s'approchent de ces principes, le seul soucis c'est que les jointures se font entièrement côté client.

    Citation Envoyé par Gugelhupf Voir le message
    La seule raison pour laquelle les gens continuent sur ces technos c'est soit parce qu'ils y sont contraints (COBOL & Mainframe), soit parce qu'ils ne connaissent pas autre chose que les outils internes aux SGBDR (T-SQL, PL/SQL). Mais bon dans certains cas l'utilisation de T-SQL et PL/SQL sont très utiles.
    J'ai déjà eu des contraintes assez bizarre mais refuser les droits d'accéder directement aux tables c'est plus qu'étranges ... C'est là qu'on se dit que la vie de tous les jours n'est pas facile et qu'on devrait enseigner aux étudiants à faire avec ce qu'on leur donne plutôt que d'essayer d'imaginer des solutions d'une complexité conceptuel sans nom pour faire un truc pragmatiquement simple.

    Citation Envoyé par Gugelhupf Voir le message
    Le must pour moi serait d'avoir du SQL standard en Java, comme pour PowerBuilder... ou le COBOL.
    J'ai déjà fait du Pro*C, ca ne m'a pas emballé plus que ça. Cependant si quelque chose de similaire doit être implémenté en Java, je suis persuadé que ca doit être plus ouvert que se limiter à SQL.

    Citation Envoyé par Gugelhupf Voir le message
    Je ne suis pas sur que les utilisateurs de SGBDR outil open source vont apprécier...
    Pour être sûr qu'on se comprenne, je parlais de "portabilité". Dès que l'on fait des choses un peu complexe/optimisée, il faut dire adieu à la portabilité. La norme permet à peine de faire mieux que SELECT * FROM FOO A JOIN BAR B ON B.REF=A.ID;.



    C'est bien pour toutes les raisons évoquées que je parle de pseudo-norme. J'ai l'impression qu'elle n'est là que pour convaincre les services "Achat". Un peu comme certains de ces "achats" qui pensent qu'on peut faire tourner n'importe quelle application Java sous Android parce qu'ils ont une base commune dans le langage et l'API.

    Au final toutes les applications, que j'ai vu qui supportent plusieurs SGBD, ont un système de débranchement pour tout ce qui concerne le SQL et invoque du code spécifique pour chaque. Et du coup se limite à 2 (voir 3 grand maximum) SGBD différent.

    Citation Envoyé par adiGuba Voir le message
    Je n'ai plus trop suivi le projet, mais il y a plein d'info ici : http://openjdk.java.net/projects/jigsaw/
    Reste à voir comment ça va évoluer d'ici là et si tout est toujours d'actualité...
    Je trouve pas super ces sites. Il y a aucune page "Actualité". Faut soit te pallucher la specs, soit la mailing list. D'ailleurs tu me surprendras toujours à être autant au courant des dernières nouveautés ... Il y a combien de tête et de bras derrière ton écran ?


    Citation Envoyé par adiGuba Voir le message
    Ce sera déjà en partie le cas dans Java 8, où il y a déjà eu un gros travail pour casser certaines dépendances entre des APIs...

    De plus la JEP 161 introduit une notion de profile "compact" avec un set limité d'API.
    Certaines JVM pourront ainsi se limiter à ces profiles (pour de l'embarqué par exemple).

    Grosso modo on peut dire qu'il y a 4 profiles :
    • compact1 qui comporte le "strict minimum" pour faire tourner bon nombre d'application Java (java.lang, java.math, java.util, java.io, java.nio, java.time, javax.net, javax.crypto, javax.security, ...)
    • compact1 qui rajoutent la gestion de RMI, SQL et XML (java.rmi,java(x).sql, java.xml, org.xml, ...)
    • compact3 enrichie cela de divers APIs moins courante (java.lang.instrument, java.lang.management, javax.annotation.processing, java.lang.model, javax.management, javax.naming, ...).
    • Enfin tout le reste nécessitera un JRE "complet" (AWT/Swing, Applet, CORBA, ...)



    Il y a également dans Java 8 un outils jdeps permettant de lister les dépendances d'un jar envers d'autres jars ou ces différents profils...
    Pour moi c'est encore trop macro :
    1. SQL et XML dans le même panier par exemple
    2. Le système de poupée russe est vraiment limité. Il auraient pu faire des sous-ensembles avec des notions de pré-requis pour les pans de code qui ont encore trop de dépendance.


    Rien que de lister les dépendances incongrues et les casser est déjà un effort considérable et un grand pas en avant. Reste à voir l'avancement.


    Citation Envoyé par adiGuba Voir le message
    Ils appellent cela des modules, et cela remplacera les simples jar.

    Grosso-modo pour faire un module il faudra ajouter un fichier "module-info.java" qui contiendra la déclaration du module, où l'on pourra définir les dépendances, l'export des classes & services ou encore le point d'entrée pour une application...
    On peut en avoir un aperçu rapide ici : http://cr.openjdk.java.net/~mr/jigsa...big-picture-01
    En lisant de travers, ce n'est ni plus ni moins qu'un bundle OSGi ... J'en vois pas réellement l'intérêt.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  4. #44
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Je trouve pas super ces sites. Il y a aucune page "Actualité". Faut soit te pallucher la specs, soit la mailing list. D'ailleurs tu me surprendras toujours à être autant au courant des dernières nouveautés ... Il y a combien de tête et de bras derrière ton écran ?
    C'est galère à suivre en effet.
    J'avais suivi la mailing-list à l'époque donc ca aide (même s'il y a pas mal de tri à faire dans les messages).



    Citation Envoyé par Nemek Voir le message
    Pour moi c'est encore trop macro :
    1. SQL et XML dans le même panier par exemple
    2. Le système de poupée russe est vraiment limité. Il auraient pu faire des sous-ensembles avec des notions de pré-requis pour les pans de code qui ont encore trop de dépendance.


    Rien que de lister les dépendances incongrues et les casser est déjà un effort considérable et un grand pas en avant. Reste à voir l'avancement.
    C'est seulement une étape pour la modularisation, et cela concerne surtout la JVM avant tout. Il pourra exister une JVM "compact1" par exemple, qui n’inclura pas toutes les autres APIs du Java standard.
    L'objectif ici étant plus de concevoir une JVM réduite plutôt qu'une JVM modularisation.

    Jigsaw devrait ensuite permettre une modularisation plus fine (module par module).



    Citation Envoyé par Nemek Voir le message
    En lisant de travers, ce n'est ni plus ni moins qu'un bundle OSGi ... J'en vois pas réellement l'intérêt.
    De "standardiser" cela dans le monde Java



    a++

  5. #45
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    @Namek
    Et on reste dans le domaine du "simple".
    Elles sont très spécifiques à Oracle surtout, parce que l'opérateur MINUS n'existe pas ailleurs, et le standard de NVL c'est COALESCE.
    La seconde requête me parait foireuse au niveau des parenthèses, aussi je ne vois pas pourquoi il faudrait remplacer les NULL par des string pour gérer des NULL, l'opérateur standard IS le fait très bien.
    Pour la dernière il faudrait ajouter ROWNUM <=1 à la sous requête (équivalent du mot LIMIT d'Oracle que je n'aime pas du tout), car le SELECT est susceptible de retourner plus d'un élément pour B.INFO

    Lorsque je parle du SQL dans du Java, ne pense pas forcément à des opérations du type INSERT/UPDATE/DELETE, mais au SELECT.


    @Namek
    Les fichiers séquentiels simples ou bien ordonnés, sont énormément plus rapide à traiter qu'une base de données avec ces changements de contexte.
    C'est surtout parce qu'une base de production DB2 demande trop de ressource, on ne peut pas s'amuser à effectuer des requêtes d’agrégat ou sélection distinctive (et compagnie). C'est pour cela qu'on préfère extraire des fichiers en bloc et travailler dessus, c'est plus rapide et ça consomme moins de ressource (contexte Mainframe & COBOL).


    @Namek
    C'est pour cela que j'aime bien les solutions NoSQL, leurs langages de requêtes s'approchent de ces principes, le seul soucis c'est que les jointures se font entièrement côté client.
    Les solutions comme NoSQL et Node.js c'est un peu du pipi de chat... C'est puissant, mais il y a le retour du bâton. Il faut demander l'avis d'un architecte BDD pour voir ce qu'il en pense en terme de conception.
    Architecte BDD


    @Namek
    J'ai déjà eu des contraintes assez bizarre mais refuser les droits d'accéder directement aux tables c'est plus qu'étranges ... C'est là qu'on se dit que la vie de tous les jours n'est pas facile et qu'on devrait enseigner aux étudiants à faire avec ce qu'on leur donne plutôt que d'essayer d'imaginer des solutions d'une complexité conceptuel sans nom pour faire un truc pragmatiquement simple.
    Un modérateur à supprimé mon lien dans un précédent message. Mais bon tu as eu l'occasion de lire Namek
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  6. #46
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    Houla, je me rend compte que je dis Namek, au lieu de Nemek, désolé, ça doit surement être les souvenirs de Dragon Ball...
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  7. #47
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : août 2005
    Messages : 2 894
    Points : 7 197
    Points
    7 197
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Elles sont très spécifiques à Oracle surtout, parce que l'opérateur MINUS n'existe pas ailleurs, et le standard de NVL c'est COALESCE.
    J'avoue ce sont mes "templates" de code Oracle pour la réplication/synchronisation de données à partir d'un référentiel. Je pensais que MINUS faisait partie du standard. Même si j'avoue remplacer (dans certains cas) par un "LEFT JOIN" + "WHERE LEFT_TABLE.ROWID IS NULL" pour des raisons de performance.
    C'est quoi l'équivalent normé ?

    Pour NVL je savais que ce n'est pas le standarad mais je m'en souviens jamais.

    Citation Envoyé par Gugelhupf Voir le message
    La seconde requête me parait foireuse au niveau des parenthèses, aussi je ne vois pas pourquoi il faudrait remplacer les NULL par des string pour gérer des NULL, l'opérateur standard IN le fait très bien.
    Dans Oracle en tout cas, IN ne gère pas le NULL car il fait un test d'égalité. Ainsi SELECT * FROM DUAL WHERE NULL IN (SELECT NULL FROM DUAL); ne renvoie aucune ligne.

    Citation Envoyé par Gugelhupf Voir le message
    Pour la dernière il faudrait ajouter ROWNUM <=1 à la sous requête (équivalent du mot LIMIT d'Oracle que je n'aime pas du tout), car le SELECT est susceptible de retourner plus d'un élément pour B.INFO
    On supposera que ID est la clé primaire, la colonne étant marqué comme unique, il n'est pas utile de répéter à Oracle qu'on peut n'avoir qu'un seul résultat.

    Citation Envoyé par Gugelhupf Voir le message
    Lorsque je parle du SQL dans du Java, ne pense pas forcément à des opérations du type INSERT/UPDATE/DELETE, mais au SELECT.
    Pourquoi l'un et pas les autres ? Sinon c'était surtout des exemples bêtes qui ont une logique de construction un peu "absurde". Pour certaines, le SGBD (tout du moins Oracle), ne va pas parcourir plusieurs fois la table mais pour d'autres, il fera bêtement ce qu'on lui a demandé.
    Par ailleurs, ca ressemblerait à quoi l'intégration de SQL dans Java ?

    Citation Envoyé par Gugelhupf Voir le message
    C'est surtout parce qu'une base de production DB2 demande trop de ressource, on ne peut pas s'amuser à effectuer des requêtes d’agrégat ou sélection distinctive (et compagnie). C'est pour cela qu'on préfère extraire des fichiers en bloc et travailler dessus, c'est plus rapide et ça consomme moins de ressource (contexte Mainframe & COBOL).
    Non c'est aussi une logique de chaînage des calculs, ca évite de reconstruire une vue. De plus, il arrive que l'on mélange les sources de données. Fichier plat et base de données. Dans l'absolu, DB2 ou pas, un appareillage de fichier va plus vite qu'une requête SQL.

    Citation Envoyé par Gugelhupf Voir le message
    Les solutions comme NoSQL et Node.js c'est un peu du pipi de chat... C'est puissant, mais il y a le retour du bâton. Il faut demander l'avis d'un architecte BDD pour voir ce qu'il en pense en terme de conception.
    Architecte BDD
    Je n'ai pas encore expérimenté mais j'ai déjà essayé de "conceptualiser" sur certaines applications qui demandaient de bonnes performances. Et bien que ma base soit largement orientée document, l'absence de jointure rend NoSQL complétement inadapté. Après il aurait peut-être fallu faire des choses différemments mais je n'ai pas d'expérience dans le domaine du NoSQL.

    Citation Envoyé par Gugelhupf Voir le message
    Houla, je me rend compte que je dis Namek, au lieu de Nemek, désolé, ça doit surement être les souvenirs de Dragon Ball...
    Aucun soucis, c'est fortement inspiré
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  8. #48
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    @Nemek
    C'est quoi l'équivalent normé [de MINUS] ?
    Je ne crois pas qu'il y ait d'équivalent normé pour le moment.



    @Nemek
    Dans Oracle en tout cas, IN ne gère pas le NULL car il fait un test d'égalité. Ainsi SELECT * FROM DUAL WHERE NULL IN (SELECT NULL FROM DUAL); ne renvoie aucune ligne.
    Le IN est avant tout une syntaxe sucrée pour : toto = 'val1' OR toto = 'val2' OR toto = 'val3', et on peut s'en passer.
    L'objet à gauche de IN, devrait être un nom de colonne si on veut bien faire les choses.
    Aussi, d'après la documentation française de PostgreSQL :
    On ne peut pas écrire expression = NULL parce que NULL n'est pas « égal à » NULL. (La valeur NULL représente une valeur inconnue et il est impossible de dire si deux valeurs inconnues sont égales.) Ce comportement est conforme au standard SQL.

    @Nemek
    Par ailleurs, ca ressemblerait à quoi l'intégration de SQL dans Java ?
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    // Pour les bases de données (syntaxe sucrée pour l'API JDBC) :
    ResultSet result := SELECT t1.id AS identifiant_client, t1.name AS nom_client, t2.*
                        FROM client t1
                        INNER JOIN information t2
                        ON t1.id = t2.fk_id_client
                        ORDER BY identifiant_client;
     
     
     
     
     
     
    // On considère le mot-clé value équivalent à this, mais pour chaque occurrence
    // Tout comme pour les EL dans JEE -> getId() devient id (on enlève le "get" et la parenthèse).
     
    // Pour les listes :
    List<String> listeClient = new ArrayList<String>(); // Remplir la liste
     
    ResultSet result := SELECT value                   
                        FROM listeClient
                        WHERE value LIKE '%Pierre-%'
                        ORDER BY value DESC;
     
     
     
     
    List<Client> listeClient = new LinkedList<Client>(); // Remplir la liste
     
    ResultSet result := SELECT value.id, value.name
                        FROM listeClient
                        WHERE value.name LIKE '%Pierre-%'
                        ORDER BY value.id DESC;
     
     
    //Equivalent (sans jointure) :
    List<Client> listeClient = new LinkedList<Client>(); // Remplir la liste
     
    ResultSet result := SELECT id, name
                        FROM listeClient
                        WHERE name LIKE '%Pierre-%'
                        ORDER BY id DESC;
     
     
    // Avec jointure :
    List<Client> listeClient = new LinkedList<Client>(); // Remplir la liste
    List<Information> listeInformation = new LinkedList<Information>(); // Remplir la liste
     
    ResultSet result := SELECT t1.id, t1.name, t2.*
                        FROM listeClient t1
                        LEFT JOIN listeInformation t2
                        ON t1.id = t2.fkClientId // Attention n'est pas une affectation, mais une comparaison !
                        WHERE t1.name LIKE '%Pierre-%'
                        ORDER BY t1.id DESC;

    A savoir :
    • On considère le mot-clé value équivalent à this, mais pour chaque occurrence.
    • Tout comme pour les EL dans JEE -> getId() devient id (on enlève le "get" et la parenthèse).
    • L'opérateur ":=" fait son apparition, pour faire la distinction avec une simple opération d'affectation.
    • Pour faire la distinction entre les différents SGBDR à consulter, on peut se servir des annotations (@interface) de préférence, sinon utiliser un fichier de configuration XML comme en JEE pour les implémentations de JPA comme Hibernate.
    • Les IDE comme Eclipse et Netbeans se chargent d'afficher les erreurs en temps réel, et le compilateur de valider la syntaxe SQL. Le SQL utilisé devra être standard à la norme SQL + quelques bonus non-standard comme les fonctions très utiles : TO_CHAR() et TO_DATE() (il y aura alors une conversion en interne vers la fonction CONVERT() pour SQL Server par exemple).
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  9. #49
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    J'ajouterais aussi qu'on ne ferait plus la distinction entre Statement et PreparedStatement, la protection contre les injections SQL sera directement prise en charge par ce nouveau système.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  10. #50
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : août 2005
    Messages : 2 894
    Points : 7 197
    Points
    7 197
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Je ne crois pas qu'il y ait d'équivalent normé pour le moment.
    Il y a toujours la possibilité avec des LEFT JOIN mais la gestion de l'égalité est vraiment chiante, il n'y a pas un opérateur qui fasse (A.ID=B.ID OR (A.ID IS NULL AND B.ID IS NULL)) ?

    Citation Envoyé par Gugelhupf Voir le message
    Le IN est avant tout une syntaxe sucrée pour : toto = 'val1' OR toto = 'val2' OR toto = 'val3', et on peut s'en passer.
    L'objet à gauche de IN, devrait être un nom de colonne si on veut bien faire les choses.
    Je ne comprends pas bien ... Là il ne s'agit pas de rechercher un tuple dans un ensemble prédéfini mais dans le résultat d'une requête.

    Citation Envoyé par Gugelhupf Voir le message
    Ca serait plutôt ici : https://postgresql.developpez.com/do...tion/francais/

    Citation Envoyé par Gugelhupf Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Pour les bases de données (syntaxe sucrée pour l'API JDBC) :
    ResultSet result := SELECT t1.id AS identifiant_client, t1.name AS nom_client, t2.*
                        FROM client t1
                        INNER JOIN information t2
                        ON t1.id = t2.fk_id_client
                        ORDER BY identifiant_client;
    Mon soucis c'est qui va écrire la syntaxe supportée ? Au final, seul un "provider" extérieur propre à chaque version de chaque SGBD est capable de valider la syntaxe, sans contenter l'intégration dans les IDE. D'où mon idée de passer par l'API de scripting.

    Citation Envoyé par Gugelhupf Voir le message
    [Suite et fin ...]
    Alors je ne comprend pas du tout ce que tu veux faire ... C'est un LinQ ?

    Citation Envoyé par Gugelhupf Voir le message
    On considère le mot-clé value équivalent à this, mais pour chaque occurrence.
    Comme pour c:forEach@var ou f:selectItems@var de JSF ?

    Citation Envoyé par Gugelhupf Voir le message
    Tout comme pour les EL dans JEE -> getId() devient id (on enlève le "get" et la parenthèse).
    Pour faire l'injection de paramètre ?

    Citation Envoyé par Gugelhupf Voir le message
    L'opérateur ":=" fait son apparition, pour faire la distinction avec une simple opération d'affectation.
    Pourquoi pas même si garder le "=" me semble être plus simple.

    Citation Envoyé par Gugelhupf Voir le message
    Pour faire la distinction entre les différents SGBDR à consulter, on peut se servir des annotations (@interface) de préférence, sinon utiliser un fichier de configuration XML comme en JEE pour les implémentations de JPA comme Hibernate.
    Avec la nouvelle API d'annotation pourquoi pas.

    Citation Envoyé par Gugelhupf Voir le message
    Les IDE comme Eclipse et Netbeans se chargent d'afficher les erreurs en temps réel, et le compilateur de valider la syntaxe SQL. Le SQL utilisé devra être standard à la norme SQL + quelques bonus non-standard comme les fonctions très utiles : TO_CHAR() et TO_DATE() (il y aura alors une conversion en interne vers la fonction CONVERT() pour SQL Server par exemple).
    Ou permettre, comme dans le cas d'Hibernate, de déclarer une liste des fonctions valides. Cette liste pourrait être fournie directement par le driver et d'étendre la liste pas annotation. Cependant je suis plutôt partisan de laisser cette validation au SGBD et de faire une validation "simple".
    Autrement les syntaxes ésotériques (ex d'Oracle : les requêtes hiérarchiques et analytiques) seront par exemple probablement pas supportées.

    Globalement mon ressenti c'est simplement t'affranchir d'utiliser des vues pour valider la syntaxe de ton SQL. Alors que finalement les vues fonctionnent très bien et sont faites pour ca. Le SGBD peut même ainsi optimiser le plan d'exécution.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  11. #51
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    Il y a toujours la possibilité avec des LEFT JOIN mais la gestion de l'égalité est vraiment chiante, il n'y a pas un opérateur qui fasse (A.ID=B.ID OR (A.ID IS NULL AND B.ID IS NULL)) ?
    Je ne crois pas qu'il y ait un équivalent de MINUS standard en SQL, mais comme le standard est déjà riche, il existe toujours un moyen de contourner cela. De plus MINUS n'est pas très important par rapport à UNION, UNION ALL, INTERSECT...
    Peut-être que MINUS sera inclue un jour dans le standard ?



    Je ne comprends pas bien ... Là il ne s'agit pas de rechercher un tuple dans un ensemble prédéfini mais dans le résultat d'une requête.
    Un ensemble prédéfini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM vehicule WHERE categorie IN ('voiture', 'camion', 'moto');



    Mon soucis c'est qui va écrire la syntaxe supportée ?
    La requête que j'ai écris est standard SQL, et fonctionne au moins sous PostgreSQL, Oracle, SQL Server, MySQL, MariaDB...



    Alors je ne comprend pas du tout ce que tu veux faire ... C'est un LinQ ?
    LINQ "essaye" de faire SQL, moi je souhaiterais "réellement" faire du SQL.



    Comme pour c:forEach@var ou f:selectItems@var de JSF ?
    Oui, c'est dans l'idée.



    Pour faire l'injection de paramètre ?
    C'est juste pour faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ResultSet result := SELECT value.id, value.name
                        FROM listeClient
                        WHERE value.name LIKE '%Pierre-%'
                        ORDER BY value.id DESC;
     
    // Au lieu de :
    ResultSet result := SELECT value.getId(), value.getName()
                        FROM listeClient
                        WHERE value.getName() LIKE '%Pierre-%'
                        ORDER BY value.getId() DESC;



    Le truc avec Hibernate, c'est que c'est pas super pour écrire des requêtes complexes en "mode objet". Du coup il faut passer par une requête HQL (Hibernate Query Language) ou DQL (Doctrine Query Language) entre des guillemets affreux (chaine de caractères). L'IDE ne permet pas d'indiquer si la syntaxe de la requête HQL est conforme ou non avant compilation + test réel.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  12. #52
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Nemek Voir le message
    [wait() / notify()] Je trouve que c'est un mécanisme aussi bien pensé que equals/hashCode/clone.
    Dans ce cas, ca permet d'avoir à passer une ressource supplémentaire (le lock) pour gérer la synchronisation sur une "simple" ressource. Ca évite de trimballer une (ou plusieurs) instances supplémentaires.
    Alors juste une petite parenthèse, après avoir essayé les méthodes wait() et notify() de la classe Object dans un modèle producteur / consommateur, je trouve que ça fait un peu goto.

    Quels seraient vos préconisations pour créer un modèle producteur / consommateur sans utiliser les méthodes wait() et notify() ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  13. #53
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Alors juste une petite parenthèse, après avoir essayé les méthodes wait() et notify() de la classe Object dans un modèle producteur / consommateur, je trouve que ça fait un peu goto.
    Oui clairement !
    Comme le goto cela semble tout simple et facile à faire, mais il faut rester bien carré et stricte sous peine de vite faire n'importe quoi !

    Citation Envoyé par Gugelhupf Voir le message
    Quels seraient vos préconisations pour créer un modèle producteur / consommateur sans utiliser les méthodes wait() et notify() ?
    Depuis Java 5 il y a l'API de concurrence qui permet (entre autres) de gérer cela de manière propre et simple via les BlockingQueue.
    Les méthodes offer()/take() permettent respectivement d'offrir ou de récupérer une valeur depuis différents threads...

    A noter que Java 6 ajoute la notion de BlockingDeque (la même chose mais dans les deux sens) et Java 7 les TransferQueue (qui permettent aux producteurs d'attendre qu'un consommateur récupère leurs valeurs avant de continuer)


    a++

  14. #54
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    décembre 2011
    Messages
    1 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 311
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Ah je connaissais pas du tout BlockingQueue<T>, ça correspond tout à fait au modèle producteur/consommateur (mode FIFO).

    1. Quels sont les implémentations de BlockingQueue<T> que vous préférez ? ArrayBlockingQueue ? LinkedBlockingQueue ? ...

    2. Sachant qu'il est possible d'imposer une limite à la pile pour LinkedBlockingQueue, quelle différence y a-t-il avec l'implémentation ArrayBlockingQueue ?
    Dans le constructeur de ArrayBlockingQueue, est-ce que réserver un tableau new T[nb_element] consomme tant de mémoire que cela ?

    3. Il existe plusieurs méthodes "producteur" : add(E e), put(E e), offer(E e), lesquels préférez-vous ?

    4. Existe-t-il des cas où TransferQueue<T> est vraiment utile ?

    Merci
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  15. #55
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 2 898
    Points : 7 611
    Points
    7 611
    Par défaut
    Je voudrais pas faire mon boulet simili-modérateur mais je pense que tu devrais créer un topic pour toutes ces questions car ça n'a plus grand chose à voir avec Jigsaw ou la modularisation du JDK là...

Discussions similaires

  1. Java : Oracle adopte une nouvelle nomenclature pour les mises à jour du JDK
    Par Cedric Chevalier dans le forum Général Java
    Réponses: 8
    Dernier message: 20/05/2013, 19h58
  2. Réponses: 2
    Dernier message: 03/11/2010, 01h38
  3. Nordea lance une nouvelle application iPhone pour ses fonds
    Par Mejdi20 dans le forum Communiqués
    Réponses: 0
    Dernier message: 12/10/2010, 00h27
  4. Réponses: 0
    Dernier message: 03/05/2010, 16h58
  5. Réponses: 0
    Dernier message: 20/04/2010, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo