19. april 2010 - 15:11Der 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)?
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).
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.
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>.
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.
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.
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...
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?
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.
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?
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.