Avatar billede kkaen Nybegynder
19. april 2010 - 15:11 Der er 22 kommentarer og
1 løsning

Cache resultset eller lignende

Jeg har nogle jsp-sider, som skal foretage nogle queries og inserts i en mysql-database. Det fungerer fint nok, men nu vil jeg gerne optimere systemet. Det vil jeg gerne gøre, så der ikke sendes data frem og tilbage hver gang, der skal bruges data eller manipuleres data.

Jeg har fundet ud af, at CachedResultSets er mest optimale, selvom man ikke må bruge resultsets generelt af sikkerhedsmæssige årsager. Et cashed er nok anderledes her?

Men hovedproblemet er så, at jeg har forsøgt at oprette nogle cashedResultsets i min code, men det giver blot problemer. Det passer ikke sammen med diverse try-catch, eller også kan compileren ikke finde en variabel, selvom den er angivet i begyndelsen af jsp'en (altså efter "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%").

Før jeg går i gang med noget yderligere debugging, så vil jeg gerne vide, om jeg er på det rigtige spor? Og om der er nogle smartere metoder, end at gå koden efter fejl på fejl i debugging (jeg rænker på smarte steder, hvori de cashedeResultsets kan angives og implementeres eller noget lignende)?
Avatar billede arne_v Ekspert
19. april 2010 - 15:18 #1
Mener du CachedRowSet ?

De en tiltaenkt at vaere et ResultSet som kan bruges uden at Connection er aaben.

For ren performance optimerinsg cache ville jeg finde det fristende at bruge en List<X> og cache den i enten application eller session (afhaengig af om den skal deles mellem brugere).
Avatar billede kkaen Nybegynder
19. april 2010 - 15:26 #2
Ja, det var egentlig også den tanke, jeg havde oprindelig. Men så foretog jeg nogle søgninger på det, og der blev resultattet hovedsageligt, at det var cachedResultSet. CachedRowSet har jeg ikke rigtig hørt om?

Jeg valgte også CashedResultSet da det så ud som om, at der fandtes mere brugervenlighed. Altså at der var diverse metoder, men kan kalde, så man får serveret en masse funktionalitet. Hvis det er en List, så skal man selv holde styr på dataen og samtidig foretage updates og andet manuelt. Ved CashedResultSet kan man oplagre en masse ændringer, og så få dem gennemført ved at kalde en commit-metode (den hedder muligvis noget andet), og så ville databasen automatisk blive opdateret. Den funktion mangler man jo ved brug af List - hvis man ikke manuelt implementerer den.
Avatar billede kkaen Nybegynder
19. april 2010 - 15:28 #3
Opdatering: det er CashedRowSet, der er tale om. Jeg huskede forkert. Men spørgsmålet er stadig det samme :-)
Avatar billede arne_v Ekspert
19. april 2010 - 15:37 #4
Der er lidt forskellige meninger om den slags. Jeg ville foretraekke List<X> og skrive den kode der skal til for at opdatere. Men du har nu efter grundige undersoegelser valgt CachedRowSet, saa vi glemmer List<X>.

Har du laest om CachedRowSet:

http://java.sun.com/developer/Books/JDBCTutorial/chapter5.html
http://www.javaworld.com/javaworld/jw-02-2001/jw-0202-cachedrow.html
http://onjava.com/pub/a/onjava/2004/06/23/cachedrowset.html
etc.

?

Med hensyn til fejl, saa skal vi nok se lidt kode og en fejlmeddelse!

:-)

Generelt vil jeg mene at CachedRowSet hoerer hjemme i Java klasser kaldt fra JSP ikke i JSP siderne selv.
Avatar billede kkaen Nybegynder
19. april 2010 - 16:36 #5
Jeg har bestemt ikke beluttet mig definitivt for CashedRowSet. Det så blot ud som om, det var det mest hensigtsmæssige. Jeg ville også gå ud fra, at List er mere hensigtsmæssig hukommelsesmæssigt, da CashedRowSet gemmes i Session, mens List vel gemmes i system-hukommelsen?

Hvis du har nogle objektive gode argumenter for at vælge List, så er jeg meget tæt på at "skifte side" :-)

Jeg mener også, at koden hører hjemme i klasser, men da jeg ikke rigtig har taget mig tid til at få først koden over i sådanne endnu, så er jeg, hvor jeg er.
Avatar billede arne_v Ekspert
19. april 2010 - 17:00 #6
Både CachedRowSet og List<X> kan gemmes hvor du ønsker at gemme dem.

Jeg foretrækker List<X> fordi den har ikke noget med database at gøre.

Diskussionen er meget klassisk i .NET verdenen hvor DataSet er ret almindelige.
Avatar billede kkaen Nybegynder
19. april 2010 - 20:52 #7
Ja, DataSet tager sig jo nærmest automatisk af al data-opdatering m.m.. Og noget lignende samme funktionalittet tilbyder CachesRowSet vel? Det var den tanke, der var skyld i mit valg.

Jeg er sådan set ligeglad med om valget bliver det ene eller andet. Blot det bliver det mest effektive og letteste at have med at gøre.
Avatar billede arne_v Ekspert
19. april 2010 - 21:04 #8
Hvorfor bruger du ikke ORM?

Hibernate eller JPA (med Hibernate eller en anden provider)

Hvis din brug er rimelig "standard" saa vil jeg tro at det giver den reneste kode.
Avatar billede kkaen Nybegynder
19. april 2010 - 21:40 #9
Det vil jeg også meget gerne. Men jeg kender ikke til teknologierne. Så hvis du har url'erne til nogle gode toturials, så vil jeg da meget gerne se dem...
Avatar billede arne_v Ekspert
19. april 2010 - 22:12 #10
http://docs.jboss.org/hibernate/core/3.5/reference/en-US/html/

er lidt omfattende men det kan jo ogsaa vaere godt.
Avatar billede kkaen Nybegynder
20. april 2010 - 08:06 #11
Det ser ud som om, det er Jboss. Det har jeg også hørt meget om, men jeg kender det ikke. Er Jboss ikke en server-type med diverse funktionaliteter?
Avatar billede arne_v Ekspert
20. april 2010 - 15:14 #12
JBoss var et firma og er nu en del af Redhat.

De har en lang raekke produkter. Heriblandt JBoss application server.

Men altsaa ogsaa Hibernate.

Hibernate kan bruges med all application servere og i Java SE applikationer.
Avatar billede kkaen Nybegynder
20. april 2010 - 17:22 #13
Okay - jeg tror da nok lige, jeg skal til at læse lidt op på dit link så :-)
Avatar billede arne_v Ekspert
20. april 2010 - 18:48 #14
Hibernate er lidt af et must at kende.

Check evt. side 13 i denne her:
  http://storage.pardot.com/1772/18317/Survey_Results.pdf
Avatar billede kkaen Nybegynder
21. april 2010 - 17:29 #15
Nu har jeg implementeret en løsning med ArrayList. Men jeg synes ikke rigtig, at jeg kan se den store forskel på hastigheden. Godt nok er serveren localhost, men jeg troede da, at man kunne se en forskel i det mindste.

Jeg har søgt lidt efter noget mere information omkring emnet. Som jeg forstod informationen, så havde man 2 muligheder for at gemme sin liste. I sessionen eller i applikationen (vist nok). Jeg valgte sessionen, da dataen ikke skal deles med andre brugere. Så læste jeg som sagt, at en session gemmes på serveren. Hvis data fra MySql-databasen først skal læses af brugeren, og de dermed skal downloades til brugerens browser, men dataen stadig caches på serveren, så vindes der vel ikke rigtig noget ved det? Dataen skal jo stadig overføres ved hver forespørgsel. Eller løser computerens lokale cache det? I så fald kan man så ikke lave forspørgsel på de data, og ikke benytte en liste i sessionen?
Avatar billede arne_v Ekspert
21. april 2010 - 17:42 #16
Du har:

browser-------web app--------database

Uden cache saa henter du helt fra databasen hver gang.

Hvis du cacher ArrayList (eller CachedRowSet) i session saa kan data hentes derfra.

Du sparer saa at hente den fra databasen.

Det hjaelper intet paa forbindelsen mellem browser og web app.

Er det der du har flaskehalsen?
Avatar billede kkaen Nybegynder
21. april 2010 - 20:54 #17
Ja, jeg tænkte det nok :-)

Da der kan være tilknyttet et individuelt billede til hver row i databasen (billedet ligger på serveren), så skal der downloades billeder hver gang, der forespørges på data i databasen. Det var ikke de billeder, jeg oprindeligt havde tænkt mig at cache, for det gik jeg ud fra, at OS eller browseren i bedste fald ville gøre. Jeg har i hvert fald ikke nogen ide om, hvordan man kan undgå at overføre billederne hver gang.

Så derfor lagde jeg kræfterne i data fra databasen. Det er ikke meget på nuværende, men det bliver formentligt flere MB.
Avatar billede arne_v Ekspert
22. april 2010 - 02:53 #18
Hvis det er de samme billeder som vises igen og igen kan de også caches. Og de bør kunne caches både i web app og i browser.
Avatar billede kkaen Nybegynder
22. april 2010 - 08:17 #19
Det er de samme billeder, ja. Caches de automatisk i browseren eller hvordan?
Avatar billede arne_v Ekspert
23. april 2010 - 01:16 #20
Hvis samme billede har samme URL og der ikke er sat diverse no-cache headere så bør browseren cache.
Avatar billede kkaen Nybegynder
26. april 2010 - 08:14 #21
Jeg har tænkt lidt over det nu, og er kommet frem til en løsning. Uden jeg har set på Hibernate endnu, så er mit løsningsforslag, at der skal laves en løsning i javascript. Jeg bruger nemlig også javascript på siden, så det vil være helt ideelt. Men det må vel nok være et andet delspørgsmål så.

Men giver du lige et "svar", Arne_v, så vi kan få lukket dette spørgsmål?
Avatar billede arne_v Ekspert
26. april 2010 - 18:04 #22
kommer her
Avatar billede arne_v Ekspert
13. juni 2010 - 04:40 #23
Så mangler du bare at acceptere svaret.
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