Avatar billede casualty Nybegynder
23. oktober 2003 - 22:52 Der er 8 kommentarer og
1 løsning

fejl ved brug af blob (java)

Jeg får denne fejl når jeg prøver at placere en binær fil, ved hjælp af blob, i min DB:

*java.io.IOException: ORA-22920: række med LOB-værdien er *ikke låst
*ORA-06512: ved "SYS.DBMS_LOB", linje 767
*ORA-06512: ved linje 1

Her er min metode hvor jeg opretter udfører sql osv:

**********************************************************

public void saveFile(String fileName, byte[] fileContent)
  {
    Statement stmt = null;
    Connection conn = null;
    ResultSet rset = null;
    try
    {
      conn = getConnection();
      stmt = conn.createStatement();
      stmt.execute("insert into files (filename, filecontent) values(' " + fileName + "', EMPTY_BLOB())");
      String blobTrick = "select filecontent from files where filename like '%" + fileName+"%'";
      rset = stmt.executeQuery(blobTrick);
      if(rset.next())
      {
        System.out.println("sat ind");
        BLOB blob =((OracleResultSet)rset).getBLOB(1);
        //BLOB blob =(BLOB)rset.getBlob(1);
        OutputStream out = blob.getBinaryOutputStream();
        out.write(fileContent);
        out.close();
      }
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
    finally
    {
      try
      {
        if (stmt != null)
        {
          stmt.close();
        }
      }
      catch (Exception e)
      {
        System.out.println(e);
      }
      try
      {
        if (conn != null)
        {
          conn.close();
        }
      }
      catch (Exception e)
      {
        System.out.println(e);
      }
    }
  }

*******************************************************

Fejlen kommer når jeg udfører "out.close();"

Ekstra spørgsmål....Hvordan kan jeg teste om der rent faktisk bliver smidt noget ned i min DB, via et simpelt sql statement?

Mvh Casualty
Avatar billede arne_v Ekspert
23. oktober 2003 - 22:59 #1
Ikke direkte relateret til problemet men...

Hvorfor ikke:

Blob blob = rset.getBlob(1);

?
Avatar billede arne_v Ekspert
23. oktober 2003 - 23:03 #2
Gæt:

String blobTrick = "select filecontent from files where filename like '%" + fileName+"%' for update";
Avatar billede casualty Nybegynder
23. oktober 2003 - 23:17 #3
Nej..det er ikke det...

arne_v >>  Jeg brugte "BLOB blob =((OracleResultSet)rset).getBLOB(1)" og "BLOB blob =(BLOB)rset.getBlob(1);" For at prøve begge dele således at jeg kunne udelukke at det var der fejlen lå...

arne_v >> "like" har jeg brugt da jeg havde nogle problemer med at den ikke ville finde den rigtige række Med "="... Det var først da jeg begyndte at bruge "like" at "if(rset.next())" blev sand så det har ikke noget med det at gøre...

Jeg har faktisk selv løst problemet nu tror jeg... Således:

public void saveFile(String fileName, byte[] fileContent,File f)
  {
    Statement stmt = null;
    Connection conn = null;
    ResultSet rset = null;
    try
    {
      java.io.FileInputStream fis=new java.io.FileInputStream(f);
      conn = getConnection();
      stmt = conn.createStatement();
      PreparedStatement pstmt1 = conn.prepareStatement("insert into files(filename, filecontent) values(?,?)");
      pstmt1.setString(1, fileName);
      pstmt1.setBinaryStream(2, fis, (int)f.length());
      pstmt1.executeUpdate();
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
  }

Det virker :)
Avatar billede casualty Nybegynder
23. oktober 2003 - 23:20 #4
Og ekstra spørgsmålet :

select Dbms_Lob.GetLength ( filecontent ) l_blob from files;

Jeg skal nok blive bedre til at undersøge grundigere før jeg stiller spørgsmål på E....

Men jeg poster altid svarende således at andre kan få gavn af det alligevel, selvom jeg selv løser det...

Tak til dem der har sat tid af til dette :)

Mvh Casualty
Avatar billede arne_v Ekspert
23. oktober 2003 - 23:21 #5
like ????

Mit gæt var at tilføje FOR UPDATE !

Ikke noget med like.
Avatar billede arne_v Ekspert
23. oktober 2003 - 23:22 #6
FOR UPDATE låser recorden.

Og det er jo det fejlen gik på.
Avatar billede arne_v Ekspert
23. oktober 2003 - 23:23 #7
Men der ingen tvivl om at dit sidste forslag er den rigtige løsning.

En simpel INSERT må da være bedre end en INSERT af ingenting plus en
update af en query.
Avatar billede casualty Nybegynder
23. oktober 2003 - 23:51 #8
Rent performance mæssigt må den første vel være rimelig tung??
Avatar billede arne_v Ekspert
23. oktober 2003 - 23:54 #9
INSERT+SELECT+implicit UPDATE må være tungere end en enkelt INSERT.

Selvom den stor operation nemlig BLOB indlæsning er den samme.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester