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

JDBC Java Discussion :

[Blob] Problème avec getBytes


Sujet :

JDBC Java

  1. #1
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut [Blob] Problème avec getBytes
    Bonjour,
    j'ai un petit souci qui est plus ou moins contourné mais j'aurai bien aimé le comprendre quand même:
    J'ai une table Oracle avec 3 colonnes, un Blob, un Number et un Varchar (ça fait très blague belge comme début...)
    Je fais donc le select des trois colonnes dans mon petit connecteur JDBC, et ensuite je récupère le résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte[] tableauDirect rs.getBytes(1);
    me renvoie un tableau de taille 88, avec des données visiblement farfelues dedans
    tandis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Blob blob = rs.getBlob(1);
    byte[] tableauBlob = blob.getBytes(1, (int) blob.length());
    me renvoie le bon tableau, de 1800 octets environ, soit une différence assez énorme.

    Je précise que le getBytes direct marchait avant et qu'on a fait quelques modifs de configuration que j'ai oublié, à la suite de quoi ça s'est mis à merdouiller.

    Quelqu'un a-t-il déjà vu ça?

    Quelques détails techniques:
    - Base Oracle 10g
    - connecteur ojdbc14.jar
    - Voici le datasource:
    Code xml : 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
     
    <local-tx-datasource>
            <jndi-name>jdbc/tn9</jndi-name>
            <use-java-context>true</use-java-context>
            <connection-url>jdbc:oracle:thin:@monserveur:1521:MABASE</connection-url>
            <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
            <user-name>login</user-name>
            <password>password</password>
            <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
            <min-pool-size>0</min-pool-size>
            <max-pool-size>20</max-pool-size>
            <blocking-timeout-millis>5000</blocking-timeout-millis>
            <idle-timeout-minutes>5</idle-timeout-minutes>
            <check-valid-connection-sql>select sysdate from dual</check-valid-connection-sql>
            <metadata>
                    <type-mapping>Oracle9i</type-mapping>
            </metadata>
      </local-tx-datasource>

    Comme je l'ai dit c'est pas très urgent la solution a été trouvée mais du coup je m'inquiète un peu pour la suite, parce que ça semble pas très stable comme système...

  2. #2
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Bonjour,

    Pour moi ces deux codes sont radicalement différents.
    Dans le 1er cas la données est stockée dans un champ binaire qui est stocké dans un champs de type RAW.
    Et le second un champs stocké dans un BLOB.
    Peut-être que vous êtes passé d'un champ ROW à BLOB pour des raisons de taille de l'élément stocké en binaire.

  3. #3
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    Ah non la base n'a pas changé d'un iota, seule l'application a été modifiée, il a toujours s'agit d'une colonne BLOB, contenant un objet java sérialisé avec les pieds (je n'ai pas la main sur le format ou l'insertion soit dit en passant)...

  4. #4
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Effectivement des 2 implémentations devraient fonctionner... du coup je ne vois pas, peut-être un changement de version de ojdbc14.jar...

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    doc de getbyte()

    Retrieves the value of the designated column in the current row of this ResultSet object as a byte array in the Java programming language. The bytes represent the raw values returned by the driver.
    Autrement dit, rien ne te garantie que c'est le contenu de ton blob. Probablement que le driver te renvoie la référence vers les blob.

    De mémoire oracle a deux manière de renvoyer au client les blob: inclu dans le stream, ou sous forme de référence à des streams à redemander au serveur. C'est le serveur qui choisi ce qu'il renvoi en fonction de divers critère. Je suppose que le serveur à décidé qu'à partir de maintenant, un blob de 1000 bytes, c'est via un stream séparé qu'il faut le récupérer.

  6. #6
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    OK, donc d'un point de vue fonctionnel, le getBytes est une très mauvaise idée dans la mesure où on ne peut pas garantir ce qu'on reçoit...
    C'est noté, merci!

    en même temps j'imagine que c'est pour ça qu'on a inventé le getBlob()...

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Plus d'infos d'ailleurs

    http://docs.oracle.com/cd/B14117_01/...979/oralob.htm

    doc du driver oracle, nulle part on appelle resultset.getBytes()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec Union (et Blob)
    Par ejaecker dans le forum InterBase
    Réponses: 5
    Dernier message: 02/09/2008, 16h51
  2. Problème avec un Blob Image
    Par colorid dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/12/2007, 10h54
  3. Problème avec BLOB
    Par identifiant_bidon dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/11/2007, 14h46
  4. Problème avec webutil et blob - WUT-121
    Par shaibi dans le forum Forms
    Réponses: 3
    Dernier message: 12/10/2006, 22h51
  5. Problème avec le type BLOB dans oracle
    Par pguedia dans le forum Oracle
    Réponses: 1
    Dernier message: 10/11/2005, 17h33

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