Avatar billede svarrer Nybegynder
15. februar 2005 - 10:05 Der er 10 kommentarer og
1 løsning

java Servlet

Hey

Jeg sidder og udvikler på nogle servlets og kom til at tænke på nogle ting:
1) Hvordan bliver request håndteret mht nye forbindelser? (altså hvis der allerede er Een bruger der bruger systemet, bliver der så oprettet en ny tråd til et nyt request fra en anden bruger? )

2) Jeg har lavet en superklasse, som jeg forestiller mig skal stå for adgangen til databasen, som de andre servlets så skal gøre brug af. Vil dette fremstå som et samtidighedsproblem? og skal det syncronizeres?

3) Når en ny forbindelse bliver oprettet til webserveren, opretter den så et objekt af min superklasse og nedlægger det igen ved hvert request?
alle min Servlets nedarver fra superklassen, som nedarver fra HttpServlet.

Mvh og på forhånd tak
Christian
Avatar billede arne_v Ekspert
15. februar 2005 - 10:12 #1
re 1)

En instans af servlet klassen (medmindre du siger at den skal lave
en instans per request). En tråd per request.

re 2)

Afhænger af om de deles om en connection eller ej.

re 3)

Nej. Se #1.
Avatar billede arne_v Ekspert
15. februar 2005 - 10:13 #2
Hvis du vil have en ny instans per request så lader du din servlet implemenetere
interfacet javax.servlet.SingleThreadModel (ingen metoder bare en markering).
Avatar billede svarrer Nybegynder
15. februar 2005 - 10:25 #3
Wow.. Tak for det hurtige svar!..
mht. sprøgsmål 2:
Jeg havde umiddelbart forestillet mig at når superklassen blev loaded, at den ville oprette en instans af min Db-controller (Dbframework singleton pattern) som så ville være public og som de andre servlets ville gøre brug af
ala:
nedarvede klasse
{
cUsers[] users = dbController.getUsers();
}
hvor dbControlleren er lavet i superklassen under init();

og stik mig et svar så jeg kan fyrer nogle points din vej! ;-)
Mvh
Christian
Avatar billede arne_v Ekspert
15. februar 2005 - 10:35 #4
Det lyder som om at der kun vil være en connection => der skal synkroniseres
eksplicit !
Avatar billede arne_v Ekspert
15. februar 2005 - 10:36 #5
svar
Avatar billede svarrer Nybegynder
15. februar 2005 - 10:41 #6
tak for svarene ;-)
Avatar billede svarrer Nybegynder
15. februar 2005 - 10:50 #7
Der er kun en connection.. ja, Og det vil så sige at ved hver tilgang til databasen skal der tilføjes en synkronized block rundt om?! eller vil det være nok at synkronisere mit dbframework?
Det foregår på den måde at min dbController kalder en metode i dens superklasse, med SQL som argument og som returnere et resultset.

superklassen:
public ResultSet getData(String sql)
  {
    ResultSet rs = null;
    Statement st = null;
    try{       
      st = getConnection().createStatement();
      rs = st.executeQuery(sql);
    }catch(Exception er){
      System.err.println("Error in DBmaster.getData(), er= "+er);
    }
    finally{
      try{
        st.close();
        rs.close();
      }catch(Exception f){}
    }
    return rs;
  }
ville det være nok at synkronisere denne metode?! Den står for AL kommunikation med DB'en??

Mvh
Christian
Avatar billede arne_v Ekspert
15. februar 2005 - 12:13 #8
Spørgsmålet kan ikke besvares, da den metode ikke virker.

Du får ikke noget godt ud af at kalde rs.close of så returnere rs.
Avatar billede arne_v Ekspert
15. februar 2005 - 12:14 #9
Hvis du henter data over i f.eks. en ArrayList af bean objects og kalder rs.close,
så er det nok at synkronisere metoden.

Hvis du ikke kalder rs.close i metoden men gør det efter at du har hevet data
ud af rs, så er det ikke nok at synkronisere metoden.
Avatar billede svarrer Nybegynder
15. februar 2005 - 13:13 #10
.. Du har fuldstændig ret! mht rs.close() Jeg har (til mit forsvar) endnu heller ikke brugt det endnu.
Jeg har lavet en lille java bean klasse der indeholder en String som navnet på objektet og så selve objectet. smart?!?
jeg har lavet koden om nu:
public synchronized Vector getData(String sql){
    ResultSet rs = null;
    Statement st = null;
    ResultSetMetaData rsmd = null;
    Vector tempObj = new Vector();
    try {
      st = getConnection().createStatement();
      rs = st.executeQuery(sql);
      rsmd = rs.getMetaData();
     
      while(rs.next()){
        ArrayList rows = new ArrayList(); // for each row..
        for(int i =0; i<rsmd.getColumnCount(); i++)
        {
          cTempObject obj = new cTempObject(); //java bean
          obj.setName(rsmd.getColumnName(i));
          obj.setObj(rs.getObject(rsmd.getColumnName(i))); //henter objektet med det tilsvarende Kolonne navn.
          rows.add(cTempObject);
        }
        tempObj.addElement(rows);
      }
    }catch(Exception er){
      System.err.println("Error in DBmaster.getData(), er= "+er);
    }
    finally{
      try{
        st.close();
        rs.close();
      }catch(Exception f){
        System.err.println("Error in getData() f=" +f);
      }
    }
    return tempObj; //returner Vectoren med arraylist's i.
  }

Hvad ville du foretrække at arbejde med ArrayList eller Vector?! her bruger jeg begge?! kan ikk lige overskue om det er smart eller hvad?
Tak for hjælpen .. du er hermed inkludret i min aftenbøn!
mvh
Christian
Avatar billede arne_v Ekspert
15. februar 2005 - 13:22 #11
Man bruger vist mest ArrayList idag.

Vector er der kun for kompabilitet med Java 1.0 og 1.1
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