PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 18/05/2011 10:07:20

aldo
Membre

Problemes lecture/ecriture getBytes et bytea avec postgresql

Bonjour,

J'ai un soucis dans la récupération d'une colonne de bytea provenant d'une base postgresql.

En effet j'insere l'element grace au code suivant :

---------------------------------------------------------------------------------------
PreparedStatement ps = connexion.getConnection().prepareStatement(requete);
ps.setBytes(1,currentLine.getBytes());
---------------------------------------------------------------------------------------

ici mon currentLine.getBytes() correspond bien au string courant.

L'élément est correctement inséré dans la base de données.


Puis au moment de la recuperation en base de cet element :

---------------------------------------------------------------------------------------
byte[] docBytes = resultat.getBytes(1);
---------------------------------------------------------------------------------------

ou 1 correspond a la colonne souhaitée, le tableau de bytes est different par rapport au currentLine.getBytes() vu plus haut. Donc le string généré est différents.

Je ne voit pas pourquoi cette difference existe, d'autant que je me suis inspiré d'un tutoriel postgresql/java.

Par exemple pour la chaine de caractere "hehohahihuhy" :

en entrée mon tableau de bytes = [104, 101, 104, 111, 104, 97, 104, 105, 104, 117, 104, 121, 47, 110]

et en sortie = [56, 54, 53, 54, 56, 54, 102, 54, 56, 54, 49, 54, 56, 54, 57, 54, 56, 55, 53, 54, 56, 55, 57, 50, 102, 54, 101]

Est-ce que quelqu'un a deja rencontré ce type de problème?

Merci d'avance

Hors ligne

#2 18/05/2011 20:10:45

flo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Pourriez-vous mettre un peu plus de code que juste ces 2 lignes (on ne sait jamais...)? Notamment les lignes avant l'insertion, et avant la récupération en base (la requête, etc...)

Et quelle version de la base de données, quelle version du driver JDBC?

Dernière modification par flo (18/05/2011 20:26:08)

Hors ligne

#3 19/05/2011 08:22:06

flo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Votre problème ressemble beaucoup à celui-là :
http://archives.postgresql.org/pgsql-jd … g00071.php
Vérifiez bien la version du driver...

Hors ligne

#4 19/05/2011 10:30:39

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Bonjour et merci de vous intéresser à mon problème.

@flo: je n'ai pas accès au lien que tu as donné.

Sinon la version de mon driver = postgresql-9.0-801.jdbc4.jar
et la version de la base = postgre 9.0

code avant la requete :
-----------------------------------------------------------------------------------------------
1- instanciation du driver = Class.forName("org.postgresql.Driver");

2- connection à la base = DriverManager.getConnection("proxool.consultation");
-----------------------------------------------------------------------------------------------

et au niveau de la recuperation :
-----------------------------------------------------------------------------------------
String requete = "SELECT NOM_DOCUMENT, DOC FROM " + TABLE_DOCS_ATTACHES + " WHERE " +
                        ID + " = " + id + " AND " +
                        DATE_FIN + " IS NULL;";

        GestionBd connexion = ConnexionPoolJDBC.getPoolConnexionJDBC().getConnexion(new Boolean(false),login);

        try {
            ResultSet resultat = connexion.executeRequete(requete);
            resultat.next();

            byte[] docBytes = resultat.getBytes("DOC");
}
---------------------------------------------------------------------------------------------------------

voila mais je suis pas sur que cela vienne du code.

Merci en tout cas de te pencher sur ça.

Julien

Hors ligne

#5 19/05/2011 11:07:29

flo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Il n'y a pas d'autre driver Postgresql dans le Classpath?

Hors ligne

#6 19/05/2011 11:09:23

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

non je n'en ai qu'un, j'ai essayé différentes versions du driver mais le problème persiste.

Hors ligne

#7 19/05/2011 11:11:31

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

voici le code qui transforme mon tableau de byte en "fichier" :

-----------------------------------------------------
File generate = new File(dir + "/", nom);
generate.createNewFile();        
           
DataOutputStream out = new DataOutputStream(new FileOutputStream(generate));

out.write(docBytes);
out.close();
-----------------------------------------------------

Hors ligne

#8 19/05/2011 11:17:51

Marc Cousin
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Pour aider au diagnostic, pouvez-vous passer le bytea_output à 'escape' dans le postgresql.conf ? (et recharcher la configuration bien sûr).
Si votre problème disparait, il est probable que vous n'avez pas la bonne version du driver (le format de sortie des champs bytea a changé avec la 9.0, il faut un driver capable de le gérer).

Hors ligne

#9 19/05/2011 11:28:56

flo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Sinon, le lien fonctionne, vous avez des restrictions pour l 'accès au web?

Ici : http://java.developpez.com/faq/jdbc/?pa … nfosDriver il y a un bout de code pour récupérer les informations du Driver. Pourriez-vous l'exécuter?

Merci.

Hors ligne

#10 19/05/2011 11:32:40

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Marc Cousin a écrit :

Pour aider au diagnostic, pouvez-vous passer le bytea_output à 'escape' dans le postgresql.conf ? (et recharcher la configuration bien sûr).
Si votre problème disparait, il est probable que vous n'avez pas la bonne version du driver (le format de sortie des champs bytea a changé avec la 9.0, il faut un driver capable de le gérer).

Bon ça fonctionne bien avec ce changement dans la conf. Est-ce que cette solution, d'après vous, est acceptable ou bien il faut que je cherche dans la version du driver?

Hors ligne

#11 19/05/2011 11:37:39

Marc Cousin
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Je pense qu'il faut que vous trouviez où traîne la vieille version du driver smile

C'est une des nouveautés de la version 9.0, et du driver jdbc 9.0. Vous aurez de meilleures performances avec le mode hex qu'avec le mode escape.

Hors ligne

#12 19/05/2011 11:43:33

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

flo a écrit :

Sinon, le lien fonctionne, vous avez des restrictions pour l 'accès au web?

Ici : http://java.developpez.com/faq/jdbc/?pa … nfosDriver il y a un bout de code pour récupérer les informations du Driver. Pourriez-vous l'exécuter?

Merci.

voilà le résultat :

----------------------------------------------------------------------------------------------------------
Driver class = class org.postgresql.Driver v8.0
Prop name = PGDBNAME
Prop description = Database name to connect to; may be specified directly in the JDBC URL.
Prop value = null
Prop name = user
Prop description = Username to connect to the database as.
Prop value = null
Prop name = PGHOST
Prop description = Hostname of the PostgreSQL server; may be specified directly in the JDBC URL.
Prop value = null
Prop name = PGPORT
Prop description = Port number to connect to the PostgreSQL server on; may be specified directly in the JDBC URL.
Prop value = null
Prop name = password
Prop description = Password to use when authenticating.
Prop value = null
Prop name = protocolVersion
Prop description = Force use of a particular protocol version when connecting; if set, disables protocol version fallback.
Prop value = null
Prop name = ssl
Prop description = Control use of SSL; any nonnull value causes SSL to be required.
Prop value = null
Prop name = sslfactory
Prop description = Provide a SSLSocketFactory class when using SSL.
Prop value = null
Prop name = sslfactoryarg
Prop description = Argument forwarded to constructor of SSLSocketFactory class.
Prop value = null
Prop name = logLevel
Prop description = Control the driver's log verbosity: 0 is off, 1 is INFO, 2 is DEBUG.
Prop value = null
prop choice 0 = 0
prop choice 1 = 1
prop choice 2 = 2
Prop name = allowEncodingChanges
Prop description = Allow the user to change the client_encoding variable.
Prop value = null
Prop name = prepareThreshold
Prop description = Default statement prepare threshold (numeric).
Prop value = null
Prop name = charSet
Prop description = When connecting to a pre-7.3 server, the database encoding to assume is in use.
Prop value = null
Prop name = compatible
Prop description = Force compatibility of some features with an older version of the driver.
Prop value = null
prop choice 0 = 7.1
prop choice 1 = 7.2
prop choice 2 = 7.3
---------------------------------------------------------------------------------------------------------------

Hors ligne

#13 19/05/2011 12:10:25

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Bon j'ai remis le driver 9.0, avec la configuration de base (bytea='hex') et ça marche!
Je comprend pas pourquoi cela ne marchais pas avant.
En fait j'avais plusieurs version du driver dans mon répertoire 'lib', j'ai tout enlevé physiquement sauf la dernière version et ca marche.

Je vous confirme ça quand même en testant cette après midi.

Hors ligne

#14 19/05/2011 14:25:48

aldo
Membre

Re : Problemes lecture/ecriture getBytes et bytea avec postgresql

Ca marche bien.
Merci à vous 2.

Le problème venait donc de la version du driver que j'utilisais et d'un conflit avec d'autres driver présent dans ma librairie, une fois enlevé du répertoire plus de conflit donc ca fonctionne normalement.

Hors ligne

Pied de page des forums