Re: JPA, optimimisticke zamykani a bezestavove update/delete

2009-08-04 Tema obsahu Ondra Medek
Ahoj,

 EntityManager muze byt bud transaction-scope (ten pouzivas) nebo extended (o
 tom pises v bode 2).

 Proc Ti vadi select, ktery se vykona v ramci merge?
 Zpusobuje vykonnostni problemy? Pokud ne, pak bych rad pripomnel zakladni
 pravidlo optimalizace: pokud nemusite, tak neoptimalizujte.
 Jinak vysledek toho selectu by se mel najit v cache (u TopLinku se to
 jmenuje second-level cache).

Ne ze by mi to uplne vadilo, ale no krapet mne to znervoznuje. Zatim
delam svoji prvni JPA aplikaci, ktera DB moc nezatizi, ale v budoucnu
mozna budeme nasazovat JPA i pro aplikace, ktere naopak DB hodne
zatezuji. Tak mne hlavne zajimalo, jestli nedelam neco spatne.

BTW. k tomu zakladnimu pravidlu optimalizace: on potom ten software
muze casem nabubret do takovych rozmeru, ze se pak nejak snadno
optimalizovat neda.


 delam typickou CRUD web aplikaci pomoci JPA a jako DAO pouzivam
 stateless session beany. Na objektu pro JPA mam pomoci @Version
 oznaceny atribut pro optimisticke zamykani. Objekt ulozim v
 HttpSession kdyz se nacte z DB, uzivatel ho pak zmeni nebo vymaze. Pro
 update, resp. delete objektu pouzivam v stateless session beane:

 update: obj2 = em.merge(obj)
 delete: em.remove(em.merge(obj));

 kde em je EntitytManager;

 Coz funguje, jak potrebuji, ovsem merge vzdy napred objekt nacita
 pomoci jednoho SELECTU:

 select ... from table t... where t.id = ?

 Po te se provede spravne UPDATE (nebo DELETE) s WHERE klauzuli
 kontrolujici verzi objektu. Ten prvni SELECT se mi zda zbytecny. Na
 webu jsem nasel jen dve reseni:

 1. Pouzivat rucni UPDATE (DELETE), coz je hlavne pro UPDATE dost
 neprakticke.
 2. Pouzivat statefull beany s nejakym rozsirenym modem pro persistence
 manager (nevim dost dobre, o co jde).

 Chtel bych se zeptat, jak je v tomto pripade spravny postup a jestli
 existuje nejake jednoduche reseni.




JPA, optimimisticke zamykani a bezestavove update/delete

2009-08-03 Tema obsahu Ondra Medek
DD,

delam typickou CRUD web aplikaci pomoci JPA a jako DAO pouzivam
stateless session beany. Na objektu pro JPA mam pomoci @Version
oznaceny atribut pro optimisticke zamykani. Objekt ulozim v
HttpSession kdyz se nacte z DB, uzivatel ho pak zmeni nebo vymaze. Pro
update, resp. delete objektu pouzivam v stateless session beane:

update: obj2 = em.merge(obj)
delete: em.remove(em.merge(obj));

kde em je EntitytManager;

Coz funguje, jak potrebuji, ovsem merge vzdy napred objekt nacita
pomoci jednoho SELECTU:

select ... from table t... where t.id = ?

Po te se provede spravne UPDATE (nebo DELETE) s WHERE klauzuli
kontrolujici verzi objektu. Ten prvni SELECT se mi zda zbytecny. Na
webu jsem nasel jen dve reseni:

1. Pouzivat rucni UPDATE (DELETE), coz je hlavne pro UPDATE dost neprakticke.
2. Pouzivat statefull beany s nejakym rozsirenym modem pro persistence
manager (nevim dost dobre, o co jde).

Chtel bych se zeptat, jak je v tomto pripade spravny postup a jestli
existuje nejake jednoduche reseni.


Dik
Ondra Medek


Re: JPA, optimimisticke zamykani a bezestavove update/delete

2009-08-03 Tema obsahu Zdenek Tronicek

Ahoj,

EntityManager muze byt bud transaction-scope (ten pouzivas) nebo  
extended (o tom pises v bode 2).


Proc Ti vadi select, ktery se vykona v ramci merge?
Zpusobuje vykonnostni problemy? Pokud ne, pak bych rad pripomnel  
zakladni pravidlo optimalizace: pokud nemusite, tak neoptimalizujte.
Jinak vysledek toho selectu by se mel najit v cache (u TopLinku se to  
jmenuje second-level cache).


Z.T.
--
Zdenek Tronicek
Department of Computer Science and Engineering
Prague   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Cituji Ondra Medek xmed...@gmail.com:


DD,

delam typickou CRUD web aplikaci pomoci JPA a jako DAO pouzivam
stateless session beany. Na objektu pro JPA mam pomoci @Version
oznaceny atribut pro optimisticke zamykani. Objekt ulozim v
HttpSession kdyz se nacte z DB, uzivatel ho pak zmeni nebo vymaze. Pro
update, resp. delete objektu pouzivam v stateless session beane:

update: obj2 = em.merge(obj)
delete: em.remove(em.merge(obj));

kde em je EntitytManager;

Coz funguje, jak potrebuji, ovsem merge vzdy napred objekt nacita
pomoci jednoho SELECTU:

select ... from table t... where t.id = ?

Po te se provede spravne UPDATE (nebo DELETE) s WHERE klauzuli
kontrolujici verzi objektu. Ten prvni SELECT se mi zda zbytecny. Na
webu jsem nasel jen dve reseni:

1. Pouzivat rucni UPDATE (DELETE), coz je hlavne pro UPDATE dost neprakticke.
2. Pouzivat statefull beany s nejakym rozsirenym modem pro persistence
manager (nevim dost dobre, o co jde).

Chtel bych se zeptat, jak je v tomto pripade spravny postup a jestli
existuje nejake jednoduche reseni.


Dik
Ondra Medek