Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 24/01/2007, 09h33   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 1
Points : 1
Par défaut Problème de récupération de blob via JDBC

Bonjour tlm,

J'ai un problème avec mon appli (techno : J2EE, Jonas, EJB + CMPBean avec rdb.oracle mapper) qui lors du mapping database-bean me renvoi les blobs sous forme de tableau de bytes mais en mettant le blob locator oracle plutôt que le contenu "utile" du blob dans ce tableau ! Ce que je récupère fait quoiqu'il y ait en base 86 bytes et ai évidemment illisible par mon appli vu que ce n'est pas le contenu du blob mais le pointeur oracle vers le fichier de stockage du blob. Apparemment ce serait lié au fait que j'utilise le driver oracle thin (foireux) et pas OCI. Le pb c'est que je ne peux pas utiliser le driver OCI vu que le serveur d'app et la base sont sur des becanes différentes. Du coup je suis coincé et obligé de corrigé mes blobs en refaisant une requete sur la base pour récupérer le resultset contenant mon tuple et d'utiliser l'api java.sql.Blob et getBlob() qui elle fonctionne très bien et me retourne le contenu "utile" du blob. Ca marche... sauf c'est que c'est degueulasse et nul coté perf. Est ce que quelqu'un aurait déjà rencontré ce problème et une idée meilleur à me suggérer ?

Merci d'avance,
Aurélien
realworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 10h13   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 533
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 533
Points : 6 469
Points : 6 469
Voici ke code que j'utilise et qui fonctionne très bien avec le driver thin:

Code :
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
54
55
56
 
  // READ a BLOB COLUMN FROM the DATABASE
  public static Image Lecture( int iDentifiant )
       throws Exception
  {
    // Register the Oracle JDBC driver
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    Connection conn = NULL ;
    String     req = "" ;
    byte[]     buffer = NULL ;
    int        iLength = 0 ;
    Image      img = NULL ;
    // Connect TO the DATABASE
     log("Lecture() : Connect to database") ;
    try {
      conn = DriverManager.getConnection (sConn, sUser, sPwd);
    } catch (Exception e) {
     log( "error connextion database : " + e.toString()) ;
    }
    conn.setAutoCommit (false);
    // CREATE a Statement
    Statement stmt = conn.createStatement ();
    req  = "select " + sColumn + ", LENGTH(" + sColumn + ") " ;
    req += "from " + sTable + " where " + sLookup + "=" + iDentifiant ;
    log("Lecture() : execute query="+req) ;
    ResultSet rset = stmt.executeQuery ( req );
    while (rset.next ())
    {
      // Get the lob
      blobImage = ((OracleResultSet)rset).getBLOB (1);
      iLength = rset.getInt(2) ;
    }
    // Close ALL resources
    rset.close();
    stmt.close();
    log("Lecture() : transform the BLOB length="+iLength) ;
    IF( iLength > 0 )
    {
      InputStream instream = blobImage.getBinaryStream();
      // CREATE TEMPORARY buffer FOR READ
      buffer = new byte[iLength];
      int length = 0;
      // Fetch DATA  
      while ((length = instream.READ(buffer)) != -1)
      {
        log("Lecture() : Read " + length + " bytes: ");
      }
      // Close input stream
      instream.close();    
      conn.close(); 
      log("Lecture() : createImage()") ;
      img = Toolkit.getDefaultToolkit().createImage(buffer) ;
    }
    RETURN img ;
 
  }
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 10h27   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 5
Points : 1
Points : 1
Quelque version de driver utilises tu stp ? Moi c le 9.2 et des brouettes. J'ai essayé le 10.1.0.4 mais sans plus de succès. Pour l'avoir testé, ma méthode getBLOB oracle retourne le blob locator et non le tableau de bytes contenant le contenu du blob ? Le truc c'est que, vu que j'utilise le rdb.oracle mapper , la récupération des données de la base vers les objets java bean se fait de manière transparente pour moi (pas de requete ni de resultset à manipuler, le mapper s'en charge). Sauf que le mapper doit merdé quelquepart car au lieu de me remplir le tableau de bytes de mon objet bean avec le contenu du blob, il me renvoi le blob locator... En fait j'ai exactement le même problème que certain sous Hibernate comme l'indique le lien ci dessous :

http://hansonchar.blogspot.com/2005/...o-byte-in.html

Sauf que les solutions proposées pour y remédier ne marche pas pour moi...

Merci quand même de ta réponse
realworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h37.


 
 
 
 
Partenaires

Hébergement Web