Précédent   Forum des professionnels en informatique > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/10/2011, 16h50   #1
Membre émérite
 
Avatar de Jidefix
 
Inscription : septembre 2006
Messages : 679
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : septembre 2006
Messages : 679
Points : 859
Points : 859
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 :
1
2
 
byte[] tableauDirect rs.getBytes(1);
me renvoie un tableau de taille 88, avec des données visiblement farfelues dedans
tandis que
Code :
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 :
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...
__________________
La signature que vous avez demandée n'est pas disponible pour l'instant, veuillez rappeler ultérieurement.
Jidefix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 17h43   #2
Membre expérimenté
 
Avatar de NicoL__
 
Homme Nicolas
Inscription : janvier 2011
Messages : 378
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations forums :
Inscription : janvier 2011
Messages : 378
Points : 528
Points : 528
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.
NicoL__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 17h56   #3
Membre émérite
 
Avatar de Jidefix
 
Inscription : septembre 2006
Messages : 679
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : septembre 2006
Messages : 679
Points : 859
Points : 859
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)...
__________________
La signature que vous avez demandée n'est pas disponible pour l'instant, veuillez rappeler ultérieurement.
Jidefix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 11h55   #4
Membre expérimenté
 
Avatar de NicoL__
 
Homme Nicolas
Inscription : janvier 2011
Messages : 378
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Localisation : France

Informations forums :
Inscription : janvier 2011
Messages : 378
Points : 528
Points : 528
Effectivement des 2 implémentations devraient fonctionner... du coup je ne vois pas, peut-être un changement de version de ojdbc14.jar...
NicoL__ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h04   #5
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 195
Points : 25 345
Points : 25 345
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
doc de getbyte()

Citation:
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.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 11h28   #6
Membre émérite
 
Avatar de Jidefix
 
Inscription : septembre 2006
Messages : 679
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : septembre 2006
Messages : 679
Points : 859
Points : 859
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()...
__________________
La signature que vous avez demandée n'est pas disponible pour l'instant, veuillez rappeler ultérieurement.
Jidefix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 13h10   #7
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 195
Points : 25 345
Points : 25 345
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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()
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h12.


 
 
 
 
Partenaires

Hébergement Web