Vra

Ek het 'n web-program wat boodskappe ontvang deur 'n HTTP-koppelvlak, Bv:.

http://server/application?source=123&destination=234&text=hello

Hierdie versoek bevat die ID van die sender, die ID van die ontvanger en die teks van die boodskap.

Hierdie boodskap moet verwerk word soos:

  • om die bypassende gebruiker voorwerp vir beide die bron en die bestemming van die databasis
  • die skep van 'n boom van voorwerpe: 'n boodskap wat 'n veld bevat vir die boodskap teks en twee User voorwerpe vir die bron en die bestemming
  • volhard hierdie boom om 'n databasis.

Die boom sal gelaai word deur ander programme wat ek nie kan aanraak nie.

Ek gebruik Oracle as die agtergrond databasis en JPA met Duwstang vir die databasis hantering take. As dit moontlik is, sal ek bly met hierdie.

Sonder veel optimization ek kan bereik ~ 30 versoeke / sek deurset in my omgewing. Dit is nie veel nie, ek wil ~ 300 versoeke / sek vereis. So ek gemeet waar die prestasie bottelnek is en bevind dat die oproepe na em.persist() neem die meeste van die tyd. As ek net kommentaar lewer uit daardie lyn, die deurset gaan goed meer as 1000 versoeke / sek.

Ek het probeer om 'n klein toets program wat gebruik eenvoudige JDBC oproepe tot 1 miljoen boodskappe voortduur tot dieselfde databasis te skryf. Ek gebruik gebind, wat beteken ek het 100 insetsels dan 'n pleeg, en herhaal totdat al die rekords in die databasis. Ek gemeet ~ 500 versoeke / sek deurset in hierdie scenario, wat sal voldoen aan my behoeftes.

Dit is duidelik dat ek nodig het om te insetsel prestasie hier te optimaliseer. Maar as ek vroeër genoem wil ek hou die gebruik van JPA en Duwstang vir hierdie, nie suiwer JDBC.

Weet jy 'n manier om joernaal insetsels met JPA en Duwstang skep? Kan jy enige ander tegniek aanbeveel vir die verbetering van JPA voortduur prestasie?

Ekstra info:

"versoeke / sek" beteken hier:. Totale aantal versoeke / totale tyd van die begin van die toets met verlede rekord geskryf databasis

Ek het probeer om die oproepe te maak na em.persist() asynchrone deur die skep van 'n in-geheue tou tussen die Servlet dinge en die persister. Dit het gehelp om die prestasie grootliks. Maar die tou het groei baie vinnig en as die aansoek sal ontvang ~ 200 versoeke / tweede voortdurend, Dit is nie 'n aanvaarbare oplossing vir my.

In hierdie ontkoppelde benadering ingesamel Ek versoeke vir 100 msec en geroep em.persist() op al ingesamel items voor die pleeg van die transaksie. Die EntityManagerFactory is die kas tussen elke transaksie.

Was dit nuttig?

Oplossing

Jy moet ontkoppel van die JPA koppelvlak en gebruik die kaal toplink API. Jy kan waarskynlik gooi die voorwerpe wat jy volhard in 'n UnitOfWork en pleeg die UnitOfWork op jou skedule (sync of asinkroniseer). Let daarop dat een van die koste van em.persist () is die implisiete kloon wat gebeur van die hele voorwerp grafiek. Toplink sal werk eerder beter as jy uow.registerObject () jou twee gebruiker jouself voorwerpe, besparing self die identiteit toetse moet dit anders doen. So sal jy eindig met:

uow=sess.acquireUnitOfWork();
for (job in batch) {
 thingyCl=uow.registerObject(new Thingy());
 user1Cl=uow.registerObject(user1);
 user2Cl=uow.registerObject(user2);
 thingyCl.setUsers(user1Cl,user2Cl);
}
uow.commit();

Dit is baie ou skool toplink btw;)

Let daarop dat die bondel baie sal help, want joernaal skryf en veral joernaal skryf met parameter bindend sal skop in wat vir hierdie eenvoudige voorbeeld sal waarskynlik 'n baie groot impak op jou prestasie het.

Ander dinge om te kyk vir: jou volgorde grootte. Daar is baie van die tyd bestee skryf voorwerpe in toplink is eintlik spandeer lees volgorde data uit die databasis, veral met die klein gebreke (Ek sou waarskynlik 'n paar honderd of selfs meer as my volgorde grootte).

Ander wenke

Wat is jou maatstaf van "versoeke / sek"? Met ander woorde, wat gebeur vir die 31ste versoek? Wat hulpbron is geblokkeer? As dit is die front-end / Servlet / web gedeelte, kan jy em.persist () in 'n ander draad loop en onmiddellik terug te keer?

Ook, is jy die skep van transaksies elke keer? Is jy skep EntityManagerFactory voorwerpe met elke versoek?

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top