Avatar billede billen Nybegynder
08. marts 2004 - 10:09 Der er 13 kommentarer og
1 løsning

[CMP] Performance ved returnering af Collection fra entity beans

Jeg har fundet følgende beskrivelse af collections og entity beans:

"An entity beans finder method that returns 1,000 rows performs 1,001 select operations on the database, which reduces performance drastically"

hvilket oversat betyder noget i retning af at hvis man fra en entity bean får returneret 1000 rækker svarer det til 1001 select sætninger?!

Passer det?

I så fald er det da ikke særlig smart at bruge CMP, hvis man skal have alle rækkerne fra en tabel.
Avatar billede arne_v Ekspert
08. marts 2004 - 10:31 #1
1)  Det passer altid med BMP.

2)  Det passer muligvis med CMP. Det afhænger af hvor smart containeren er.

3)  Entity beans er heavy weigth objekter designet til brug ved typiske
    enkelt record operationer.

    De er ikke velegnet til summariske operationer på mange records.
Avatar billede billen Nybegynder
08. marts 2004 - 10:46 #2
Men hvis jeg gerne vil have alle records fra en tabel, hvordan skal jeg så gøre det?
Avatar billede arne_v Ekspert
08. marts 2004 - 10:52 #3
Hvis du skal hente 50 records bruger du CMP og regner med at din container gør
noget smart ved load.

Hvsi du skal lave en sumemring af et felt i 100000 records laver du en session
bean som bruger JDBC til at lave en SELECT SUM(felt) FROM tabel.
Avatar billede arne_v Ekspert
08. marts 2004 - 10:54 #4
Entity beans er ikke dårlige. De er designet til et specifikt formål.

Sammenligning:

En HashMap er god til at slå op på key. Dårlig til at finde element nummer 741.
Den er ikke "god" eller "dårlig" - den er designet til et bestemt formål. Og
til et andet formål vælger man en anden type f.eks. ArrayList.
Avatar billede billen Nybegynder
08. marts 2004 - 10:57 #5
Ok. Men jeg skal hente 10000+ records og KUN returnere dem til klienten (som så kan få lov til at lege med dem). Kan jeg så stadigvæk bruge CMP?

Forresten ved du om JBoss tilbyder en ordentlig container i forhold til dette spørgsmål om CMP?
Avatar billede arne_v Ekspert
08. marts 2004 - 11:13 #6
Jeg er lidt skeptisk overfor behovet for at returnere 10000+ records til en client.

:-)

Det vil virke med CMP. Men du vil næppe få helt optimal performance ud af det.
Avatar billede arne_v Ekspert
08. marts 2004 - 11:14 #7
Man plejer at kunne sætte en debug option, så man man kan se alle de
SQL sætninger JBoss eksekverer ved CMP !
Avatar billede arne_v Ekspert
08. marts 2004 - 14:07 #8
<category name= "org.jboss.ejb.plugins.cmp " >
<priority value= "TRACE " class= "org.jboss.logging.XLevel "/ >
</category >

i JBoss 3.x
Avatar billede billen Nybegynder
08. marts 2004 - 18:29 #9
Tak for det arne. Læg lige et svar.

P.s. Grunden til at vi henter så mange rækker er at vores applikation skal præsenterer så mange lydfiler for brugeren. Han skal arbejde med dem og tilføje dem til en playliste.
Avatar billede arne_v Ekspert
08. marts 2004 - 18:38 #10
ok
Avatar billede billen Nybegynder
09. marts 2004 - 14:27 #11
Jeg har tilføjet det du skrev til log4j.xml konfiguration filen. Hvor kommer debug outputtet henne? Jeg har tjekket filerne i log mappen og outputvinduet. Der er ikke noget?

Den har registreret ændringen i konfigurationsfilen.
Avatar billede arne_v Ekspert
09. marts 2004 - 16:37 #12
Kig i boot.log efter "Executing SQL".

Der er en million linier med crap. Men man kan godt finde det.
Avatar billede jpjens Nybegynder
09. maj 2004 - 14:23 #13
Hej Arne,

Jeg kommer til at udfordre dig på '1)  Det passer altid med BMP.'!?

En standard finder 'findByZipCode(..)' ville nok implementeres som en 'SELECT * FROM ... WHERE ZIP_CODE = ?' så der er altså tale om en enkelt forespørgsel!

Jeg er enig i at det er ringe udnyttelse af containerens ressourcer - primært memory - at returnere 1000 entiteter. Men at der ligefrem bliver udført 1001 forespørgsler for at hente dem køber jeg ikke!!
Avatar billede arne_v Ekspert
09. maj 2004 - 14:46 #14
Sådan kunne man have valgt at lave BMP entity beans, men det har man ikke.

En BMP entity bean finder returnerer en collection af primary keys, hvorefter
containeren loader de enkelte beans ind i en ny collection.

1 * SELECT pkfelt FROM tabel WHERE andetfelt = ?
N * SELECT * FROM tabel WHERE pkfelt = ?
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