Avatar billede a-torsten Nybegynder
12. november 2002 - 13:34 Der er 17 kommentarer og
2 løsninger

Meget langsom database.....

Lige et spørgsmål....

Vi prøver at finde ud af om et ord findes i en database...... (Ordbog)

Søgningen tager i JAVA med en ODBC connection hele 7-8 sekunder, hvor den i ASP kun tager 0.6 sekund...

Det er en database med 366.000 ord.... I hver sin post.....

Hvilken måde vil i anbefale os at bruge for at bringe vores søgetid ned på noget der minder om ASP´ens tid..??

-Anders
Avatar billede disky Nybegynder
12. november 2002 - 13:36 #1
Det er din odbc bridge der er problemmet.

Brug en rigtig database som f.eks. MySQL så skal du se performance :)
Avatar billede idle Nybegynder
12. november 2002 - 13:41 #2
Hvis du opretter en forbindelse til databasen (ny connection) hver gang du vil slå et ord op, så ændr det til at forbindelsen bliver oprettet når programmet starter - så slipper du for at oprette objekter til højre og venstre.

Der kan også være meget ved at anvende JDBC i stedet for ODBC - vel og mærke hvis man har en JDBC driver til den pågældende database.
Avatar billede a-torsten Nybegynder
12. november 2002 - 13:44 #3
Hvor meget forskel er der på Access og MySql.. Vel ikke hele 7-8 sekunder..??

-Anders
Avatar billede arne_v Ekspert
12. november 2002 - 13:47 #4
Ved enkelt-bruger adgang til lokal database
er MS Access faktisk meget hurtig.

Men JDBC-ODBC bridgen fra SUN har ikke noget
godt ry.

Jeg synes dog ikke rigtigt at det kan forklare 7-8
sekunder.
Avatar billede disky Nybegynder
12. november 2002 - 13:47 #5
odbc er langsom, og jdbc-odbc bridgen er ikke særligt god heller.

Kig også på idle's svar.
Avatar billede disky Nybegynder
12. november 2002 - 13:52 #6
post lige din kode du bruger til at snakke med odbc bridgen med.
Avatar billede a-torsten Nybegynder
12. november 2002 - 13:52 #7
Det er ikke når vi åbner databasen problemet forekommer, men i selve søgningen...

Vores søgealgorimte ser således ud....

while (rs.next()||!fundet)
{
  tempOrd = rs.getString(1);
  if(ord.equals(tempOrd))
  fundet = true;
}

Det er den som virkelig trækker tænder ud....

-Anders
Avatar billede magoo20000 Nybegynder
12. november 2002 - 13:53 #8
Hvorfor ik lave det i sql?
Avatar billede idle Nybegynder
12. november 2002 - 13:56 #9
Hvis Java'en skal oprette et resultset med 360k poster, så forstår jeg godt at det tager 7-8 sekunder!! Som magoo skriver, så skal der helt klart laves en SQL forespørgsel.
Avatar billede a-torsten Nybegynder
12. november 2002 - 13:56 #10
try
        {
            Statement statement = con.createStatement();
               
            String query = "SELECT * FROM " + tableName;
       
            ResultSet rs = statement.executeQuery(query);
           
            try
            {
               
                while (rs.next())
                {
                    tempOrd = rs.getString(1);
                                   
                    if(ord.equals(tempOrd))
                        fundet = true;
                                   
                }
           
           
            }
            catch(SQLException sqlex)
            {
                sqlex.printStackTrace();
                Dialog.show("SQL Fejl",sqlex.toString());
            }
           
            statement.close();
        }
        catch(SQLException sqlex)
        {
            sqlex.printStackTrace();
            Dialog.show("SQL Fejl",sqlex.toString());
        }
Avatar billede a-torsten Nybegynder
12. november 2002 - 13:57 #11
Avatar billede idle Nybegynder
12. november 2002 - 13:59 #12
String query = "SELECT * FROM " + tableName + " WHERE (kolonnenavn) = \"" + ord +"\""

eller noget i den stil ;-)
Avatar billede idle Nybegynder
12. november 2002 - 14:00 #13
(kolonnenavn) skal så skiftes ud med det som kolonnen hedder i databasen.

På den måde får databasen lov til at gøre det den er god til - at udvælge posten for dig.

Java-en skal så også kun oprette et resultset med een post i stedet for 360000, hvilket mildest talt er lidt mindre hukommelses- og CPU-tungt.
Avatar billede disky Nybegynder
12. november 2002 - 14:05 #14
og ret:
                while (rs.next())
                {
                    tempOrd = rs.getString(1);
                                   
                    if(ord.equals(tempOrd))
                        fundet = true;
                                   
                }

til
                while (rs.next())
                {
                    tempOrd = rs.getString(1);
                                   
                    if(ord.equals(tempOrd))
{
                        fundet = true;
break;
}
                                   
                }


Hvis du endelig vil bruge den 'grimme' query, når du har fundet det du søger er der ingen grund til at forsætte i løkken.
Avatar billede a-torsten Nybegynder
12. november 2002 - 14:07 #15
idle.. Gider du at svare... Nu er vi altså nede på noget der ligner 0.3 sekund.. Med access....

Takker :o)
Avatar billede idle Nybegynder
12. november 2002 - 14:09 #16
stregnt taget kan while-løkken lige så godt dø. If-sætningen er redundant i forhold til SQL-sætningen. Bare nøjes med: 

if (rs.getNext()){
    tempOrd = rs.getString(1);
    fundet = true;
} else
    fundet =  false;
Avatar billede a-torsten Nybegynder
12. november 2002 - 14:10 #17
disky... - Hvad mener du helt præcis med "grimme" query. Kan det laves smartere el.????
Avatar billede disky Nybegynder
12. november 2002 - 14:14 #18
ja med en where clausul som idle nævner.
Avatar billede a-torsten Nybegynder
12. november 2002 - 14:16 #19
Ja okay.... Så misforstod vi vist hinanden... Men mange tak for de fine svar... Dem er vi meget glade for... :o)
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