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
Annonceindlæg fra Computerworld
23. oktober 2003 - 22:59
#1
Ikke direkte relateret til problemet men... Hvorfor ikke: Blob blob = rset.getBlob(1); ?
23. oktober 2003 - 23:03
#2
Gæt: String blobTrick = "select filecontent from files where filename like '%" + fileName+"%' for update";
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 :)
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
23. oktober 2003 - 23:21
#5
like ???? Mit gæt var at tilføje FOR UPDATE ! Ikke noget med like.
23. oktober 2003 - 23:22
#6
FOR UPDATE låser recorden. Og det er jo det fejlen gik på.
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.
23. oktober 2003 - 23:51
#8
Rent performance mæssigt må den første vel være rimelig tung??
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.
Computerworld tilbyder specialiserede kurser i database-management