2010-06-11 4 views
2

Je reçois ce cas bizarre lors de l'interrogation Postgres 8.4 pour certains enregistrements avec Blobs (de type OID) avec Hibernate. La requête ne retourne bien mais quand mon code veut lire le contenu du blob avec le code simple ci-dessous, il obtient 0 octets retourPostgresql 8.4 lecture BLOB de style OID avec Hibernate

public static byte[] readBlob(Blob blob) throws Exception { 
    InputStream is = null; 
    try { 
     is = blob.getBinaryStream(); 
     return org.apache.commons.io.IOUtils.toByteArray(is); 
    } 
    finally { 
     if (is != null) 
      try { 
       is.close(); 
      } 
      catch(Exception e) {} 
    } 
} 

pense drôle est que je reçois ce comportement que depuis que je suis commencé à ajouter plus d'un de ces enregistrements à la table. La bibliothèque JDBC sous-jacente est de type 3 (postgresq 8.4-701). Quelqu'un peut-il me donner un indice sur la façon de résoudre ce problème? Merci

Peter

+0

Si vous obtenez 6 octets à l'époque je dirais que vous lisez l'OID, 0 octets pourrait signifier soit que l'OID était nul, soit que le blobdata ne mesurait que 0 octet. Essayez d'hiberner 3.6 btw. – Justin

Répondre

0

Ce fut un moment que j'ai couru dans la même question, et comme je l'ai rafraîchi mes souvenirs sur ce sujet, je pense à partager les résultats. Le problème est que Postgres (et quelques autres versions d'Oracle) ne gérera pas le contenu Blob au moment de la création de l'enregistrement dans la même transaction. Drôle pense que l'on doit passer le contenu après le fichier externe (où le contenu est stocké éventuellement) a été bien créé et réservé pour l'opération. Oui, le disque est créé mais le Blob est vide. Pour que le Blob soit rempli avec tout ce que vous avez besoin de mettre, vous avez besoin de cette opération dans une seconde transaction (sorte d'enregistrement de mise à jour). C'est une entreprise drôle (peut-être un bug majeur), EHE

+1

PostgreSQL prend définitivement en charge la gestion des objets blob dans la transaction principale. C'est une bonne raison pour utiliser les blobs dans la base de données. Je ne connais pas Hibernate ... –

+0

J'ai débogué au niveau du client JDBC quels appels sont faits. Il me semble que dans certains cas, lorsque le contenu à stocker est limité, la transaction avec le Blob se poursuit sans problème. Mais passer un certain seuil, la transaction ne va pas. Cela peut être dû à un paramètre de configuration Postgres dont je ne suis pas encore au courant. Mais merci pour vos commentaires si –

Questions connexes