Avatar billede lifo Nybegynder
30. maj 2003 - 19:45 Der er 9 kommentarer og
1 løsning

hurtigeste indsættelse i database

jeg sal indsætte en masse date ca 20.000 poster ind i en database (HSQLDB)
jeg har dataene i en Vector
hvad er den hurtigeste måde at gøre det på `???
Avatar billede arne_v Ekspert
30. maj 2003 - 20:06 #1
Lav en prepared statement.

Loop over vector.

Indsæt værdier og kald executeUpdate for hver record.
Avatar billede lifo Nybegynder
30. maj 2003 - 20:47 #2
det har jeg også gjordt men tænkte bare om man ikke kunne gøre det på en hurtigere måde
Avatar billede arne_v Ekspert
30. maj 2003 - 21:56 #3
Jeg er ret overbevist om at prepared statement er det hurtigste JDBC
kan tilbyde.

Har du eksperimenteret med 1 TX versus 20000 TX (autocommit versus
commit) ?
Avatar billede arne_v Ekspert
31. maj 2003 - 19:17 #4
Iøvrigt bør det ikke tage så lang tid at sætte 20000 poster ind
i en database idag.

2-5 minutter på "hjemme PC hardware". Under 1 minut på "professionel server".
Avatar billede lifo Nybegynder
01. juni 2003 - 01:22 #5
rigtigt nok det tager kun ca 4-7 min
men jeg har flere tråde kørende paralelt der alle indsætter ca 10-20.000

vil eksperimentere lidt med det i morgen eller på mandag lige nu er jeg for fuld
Avatar billede arne_v Ekspert
01. juni 2003 - 15:28 #6
Ja der er ikek de store performance fordele ved
at indsætte i en database fra flere tråde.

(men der kan være andre gode grunde til det f.eks. ved at
dataene naturligt bliver genereret i tråde)

Bedste bud på en forbedring ville være 1 TX versus 20000 TX.
Avatar billede arne_v Ekspert
01. juni 2003 - 23:08 #7
Jeg eksperimenterede lige lidt og med den database jeg testede
var 10000 INSERT i 1 transaktion dobbelt så hurtigt som 10000 INSERT
i 10000 transaktioner.

Bemærk at dette er meget database specifikt. Jeg testede på
Sybase 11.9.2 på Windows 2000. I en meget low-end konfiguration.
Avatar billede lifo Nybegynder
09. juni 2003 - 19:21 #8
øhhh der er lidt lang tid siden jeg oprættede dette spørgsmål
jeg var list fuld den uge jeg spurgte om det
og havde ikke helt tænkt over hvad problemet var
det er at jeg laver ikke bare en simpel indsæt men
først updaterer jeg et felt i databasen(eksisterer=0)
og så laver jeg en select for at finde ud af om det som jeg skal indsætter eksisterer og om det ikke eskisterer så indsætter jeg det ellers så updaterer jeg et felt i den post som eksisterer
hmmm måske dårligt forklaret  men her kommer koden  så bliver det nok mere tydeligt

private void subScann(String sub){
         
  FTPFile[] filer;
  if (sub.equalsIgnoreCase(".")) sub="";
  try{
    // resets scannbit
    if (!ftp.changeWorkingDirectory(sub)){
    System.out.println("kunne ikke skifte til mappe"+ sub +" fra mappe "+directory);}
  if (directory.length()>1)
  directory+="/"+sub;
  else directory=sub;     
// gets all dir and files in the directory
  filer = ftp.listFiles();
  if (filer!=null){
    //System.out.println ("øhhh files lenght"+filer.length);
    // runs throu the files and cheks if it's a file or directory
    for(int i=0;i<filer.length;i++){
    if (filer[i].isDirectory()&& !filer[i].getName().equalsIgnoreCase(".") && !  filer[i].getName().equalsIgnoreCase("..")){
  // is a directory and calls itself with the name of the directory
  subScann(filer[i].getName());
  } // end if
  else if (filer[i].isFile()){
  if(options.getDbaFiltered()==Options.SCANN_FILTERED){
  boolean in_filter=false;
for (int in = 0; in<filters.length; in++){
  if (filer[i].getName().endsWith(filters[in])){
  in_filter=true;
  }
  }
  if(in_filter){
    status.addToTotalSize(filer[i].getSize());
    // cheks if the file is in the database
    if (!dba.exists(sObj.getSiteId(),filer[i].getName(),directory)){
    // inserts the file if it dos not exists
    dba.insertFile(sObj.getSiteId(),directory,filer[i].getName(),filer[i].getSize(),filer[i].getTimestamp().getTime().toString(),new java.sql.Date(new java.util.Date().getTime()));
    status.addToNewFileCount();
    }else {
    status.addToTotalFileCount();
    //System.out.println ("ok nu skulle vi kalde update filestate"+testantal );
    dba.updateFileState(filer[i].getName(),directory,sObj.getSiteId(),Database.FILE_EXIST);
  } //end else
  }//end if (in_filter)
  }else{ // end options.getFiltered
  status.addToTotalSize(filer[i].getSize());
  // cheks if the file is in the database
  if (!dba.exists(sObj.getSiteId(),filer[i].getName(),directory)){
  // inserts the file if it dos not exists
  dba.insertFile(sObj.getSiteId(),directory,filer[i].getName(),filer[i].getSize(),filer[i].getTimestamp().getTime().toString(),new java.sql.Date(new java.util.Date().getTime()));
                          status.addToNewFileCount();
                      }else {
                          status.addToTotalFileCount();                         
                            //System.out.println ("ok nu skulle vi kalde update filestate"+testantal );
                            dba.updateFileState(filer[i].getName(),directory,sObj.getSiteId(),Database.FILE_EXIST);
                          }
               
                }// end else
        }// end if it is a file 
        setChanged();
        notifyObservers(status);
        } // end for
        }// end if filer=null
       
        ftp.changeToParentDirectory();
        int længde = directory.length()-sub.length();
        if (længde >2 ) længde=længde-1;
        directory=directory.substring(0,længde);
       
     
      }catch(IOException e){ 
          mainFrame.log.addError("ups et eller andet gik galt når vi scannede ??"+e.toString());
          System.out.println ("øhhh fejl i scannings processen");
              }
          }// end subScann
Avatar billede arne_v Ekspert
09. juni 2003 - 19:55 #9
Det kunne stadigvæk godt wrappes i 1 transaktion.

Men jeg er tilbøjelig til at tro at det er database tuning og ikke
java tuning der vil gives mest.
Avatar billede arne_v Ekspert
11. juli 2003 - 19:15 #10
Kommet videre ?
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
Kurser inden for grundlæggende programmering

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