Avatar billede casualty Nybegynder
24. oktober 2003 - 20:01 Der er 22 kommentarer og
1 løsning

Problemer ved brug af blob

Jeg har lavet en tabel med 2 kolonner(filename varchar, filecontent Blob) og jeg har lavet et javaprograme der smider en fil i databasen.. Fint nok jeg læser over det hele at maxfilstørrelsen ligger på ca 4GB men min vil ikke modtage filer på fx. 20000bytes 20KB...Den virker fint med filer på ca 1000bytes...Jeg får en fejlmeddelelse der siger "java.sql.SQLException: Datastørrelsen overskrider maksimumstørrelsen for denne type: 20992"

Håber at der er nogen der kan hjælpe :)
Er det fordi at den skal have filen ned i flere bidder eller hvad??

Mvh Casualty
Avatar billede arne_v Ekspert
24. oktober 2003 - 20:30 #1
Fakta:
  setBinaryStream er beregnet på LONGVARBINARY felter
  LONGVARBINARY er LONG RAW i Oracle

Gæt:
  setBinaryStream og et BLOB felt duer ikke
  setBlob vil virke
Avatar billede casualty Nybegynder
24. oktober 2003 - 21:44 #2
Nu har jeg roddet med det i lang tid og kan ikke umiddelbart se hvordan jeg laver en OracleConnection...Sådan her ser min connection ud nu... Kan du hjælpe mig?

Class.forName("oracle.jdbc.driver.OracleDriver");
      Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@***:1521:***", "***", "***" );

Jeg prøvede at lave en OracleConnection men skal der også Class.forName på?? Og hvordan skal den se ud..Måske er det der fejlen ligger

problemet opstod ved "oracle.jdbc.dbaccess.DBAccess"

Error(49,47): identifier required, but package found

OracleConnection conn = new OracleConnection(oracle.jdbc.dbaccess.DBAccess,"**","**","**","**",null);
Avatar billede casualty Nybegynder
24. oktober 2003 - 21:47 #3
btw: (oracle.jdbc.dbaccess.DBAccess,"**","**","**","**",null); Der hvor der står "null" skal der være en Properties...Hvad gør jeg der??
Avatar billede arne_v Ekspert
24. oktober 2003 - 21:52 #4
Og hvorfor vil du det ?

Jeg mener da at oracle.sql.BLOB har statiske metoder til at create
en instans med.
Avatar billede casualty Nybegynder
24. oktober 2003 - 21:56 #5
Ok..Fint..Jeg ville gerne gøre således:
Blob blob = new Blob();
      pstmt1.setBlob(2,blob);
Men Blob er Abstrakt..Hvordan gør man så?
Avatar billede casualty Nybegynder
24. oktober 2003 - 22:01 #6
Jeg laver vel en klasse der implementer blob
Avatar billede arne_v Ekspert
24. oktober 2003 - 22:05 #7
Nej. Du bruger en statisk metode i oracle.sql.BLOB til at
instantiere et sådant objekt og da den extender java.sql.Blob, så
kan den bruges.
Avatar billede casualty Nybegynder
24. oktober 2003 - 22:10 #8
Men Oracle.sql.BLOB vil have en Oracleconnection + et bytearray med som parameter...Det var derfor jeg oprindeligt gerne ville lave en OracleConnection...
Hvad mener du? Jeg tror ikke at jeg forstår helt...Du må gerne komme med en kodestump som eksempel på hvordan jeg laver et Blop/BLOP
Avatar billede arne_v Ekspert
24. oktober 2003 - 22:41 #9
Du burde kunne lave en BLOB med BLOB.createTemporary metoden (og den tager
kun en java.sql.Connection som argument).
Avatar billede arne_v Ekspert
24. oktober 2003 - 22:46 #10
Imidelrtid syntes de fleste at bruge INSERT med empty_blob() og så
opdatere.

[husk FOR UPDATE]

Men der står en masse i docs !

Google fandt:
http://www.engin.umich.edu/caen/wls/software/oracle/java.901/a90211/oralob.htm
Avatar billede arne_v Ekspert
24. oktober 2003 - 22:50 #11
INSERT først har du vel styr på (jævnfør tidliger spørgsmål - bare husk
FOR UPDATE).

Med hensyn til det andet så kan jeg ikke finde nogle gode eksempler
for BLOB, men kun nogen for CLOB:

http://otn.oracle.com/sample_code/tech/java/codesnippet/xmldb/HowToLoadLargeXML.html#JDBCCode

http://otn.oracle.com/sample_code/tech/xml/xmldb/simplebulkloader/oracle/otnsamples/xmldb/simplebulkloader/examples/SimpleBulkLoader.java.html

men de burde også kunne bruges fordi JDBC mæssigt er BLOB og CLOB
meget ens.

(der skal selvfølgelig ændres lidt Character->Binary men ...)
Avatar billede arne_v Ekspert
24. oktober 2003 - 22:56 #12
Og hvis ikke du kan få det til at virke, så må jeg finde mine
Oracle CD'ere frem og installere 9i DB og lave et eksempel.
Avatar billede casualty Nybegynder
25. oktober 2003 - 14:33 #13
Jeg fik det til at virke... jeg låste rækken med "for update"....

Koden blev således:

public boolean saveFile(File file)
  {
    Statement stmt;
    Connection conn;
    try
    {
      InputStream in = new FileInputStream(file);
      byte fileContent[] = new byte[(int)file.length()];
      in.read(fileContent);
      conn = getConnection();
      conn.setAutoCommit(false);
      stmt = conn.createStatement();
      stmt.execute ("insert into files(filename,filecontent) values ('"+file.getName()+"', empty_blob())");
      BLOB blob;
      String cmd = "SELECT * FROM files WHERE filename='"+file.getName()+"' for update";
      ResultSet rset = stmt.executeQuery(cmd);
      if(rset.next())
      {
        blob = ((OracleResultSet)rset).getBLOB(2);
        OutputStream outstream = blob.getBinaryOutputStream();
        outstream.write(fileContent);
        outstream.flush();
        outstream.close();
        conn.commit();
        rset.close();
        stmt.close();
        conn.close();
        return true;
      }
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
    return false;
  }

Med hensyn til performance så kan man vel sige at, ved det at man skal gemme en fil i databasen, som i forvejen sikkert vil tage tid, så betyder det vel ikke så meget at man udfører 2 querys...?? Den tid det tager at udføre de 2 querys er jo ingenting i forhold til den tid det tager at sende filen.

arne_v >> Læg et svar så du kan få nogle points...Jeg selv vender sikkert tilbage senere med en masse spørgsmål om enterprisebeans da jeg skal bruger disse i forbindelse med mit blob...

Mvh Casualty
Avatar billede arne_v Ekspert
25. oktober 2003 - 14:35 #14
OK
Avatar billede arne_v Ekspert
25. oktober 2003 - 14:37 #15
Og ja - overhead ved den ekstra SQL sætning må være ret lille.
Avatar billede arne_v Ekspert
25. oktober 2003 - 14:38 #16
entity beans med CMP ?
Avatar billede casualty Nybegynder
25. oktober 2003 - 14:40 #17
Da det nu alligevel er 100 points kan du så ikke hurtigt svare mig på hvad foreskellen er på "Container managed persistence" og "bean managed persistence"

Jeg studerer datamatiker og vi er igang med et eksamensprojekt, vi benytter meget Oracle´s teknologier database og jdeveloper hvilket jo er helt fint... Problemet er at lige omkring enterprisebeans har vi ikke lært så meget. Dvs. at vi har kørt en tutorial igennem i jdeveloper og problemet her er at den laver nærmest det hele for os... Derfor føler jeg at jeg har en ringe forståelse for hvad hele det der enterprisebeans egentlig står for...

Mvh Casualty
Avatar billede arne_v Ekspert
25. oktober 2003 - 15:40 #18
CMP betyder at du kun skriver business metoderne på entity beanen men
at containeren skriver JDBC koden som loader og saver data.

BMP betyder at du også selv skriver JDBC koden som loader og saver
data.
Avatar billede arne_v Ekspert
25. oktober 2003 - 15:44 #19
Jeg tror iøvrigt ikke at BLOB egner sig til entity beans.
Avatar billede casualty Nybegynder
25. oktober 2003 - 15:56 #20
Nej...jeg ved det ikke, nok mest fordi at jeg ikke ved så meget endnu om entity beans...Men målet med projektet er jo lige så meget at finde ud af hvad der er ideelt og hvad der ikke er... Så tror du ikke at man kan lave det?
Avatar billede casualty Nybegynder
25. oktober 2003 - 16:07 #21
Vil vil da kunne drage noget erfaring af at finde ud af hvofor det måske ikke var så smart at lave det på den måde vi gjorde
Avatar billede arne_v Ekspert
25. oktober 2003 - 16:09 #22
Du kan sagtens lave en J2EE løsning som bruger BLOB.

Du bør også kunne lave en EJB løsning som bruger BLOB.

Jeg er bare skeptisk overfor entity beans og BLOB.
Avatar billede arne_v Ekspert
25. oktober 2003 - 16:11 #23
Og man lærer altid noget ved at prøve noget.

:-)
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