Zdravím,
U webových aplikací je práce s Hibernate celkem snadná. View musí běžet
v další vlastní transakci. Nová proto, aby oddělila transakci provedené
akce. U složitějších akcí postupujeme stejně jako v GUI.
U GUI je to složitější a my jsme tento problém řešili takto:
Máme session, která je platná po celou dobu běhu aplikace (sezení
uživatele). Tato session má nastaveno flush na manuální (aby provedené
změny byly uloženy atomicky v naší transakci).
Když uživatel potřebuje provést nějaké změny, má dvě možnosti:
- použije stejnou session a provede změny do objektů. Když jsou
provedeny změny a mělo by se ukládat, zahájí transakci, flushne spojení
a commitne.
- vytvoří si novou session do jiného vlákna, zahájí transakci, provede
změny a pak dá flush a commit. Nevýhodou této části je, že objekty je
nutné buď načíst znovu nebo asociovat s novou session.
Otázkou tedy je jak pracovat se spojením v době, kdy nejsou prováděny
změny - v případě JDBC transakcí to můžeme ignorovat (tak to děláme my)
- protože neprovádíme změny, nebude nám běžící transakce nic blokovat.
Další možnost je vzít spojení (session.connection()) a vnutit mu dočasně
autocommit režim. Pokud používáte JTA transakce je to celé
komplikovanější.
Občas je dobré, zkontrolovat si při vývoji session.isDirty, abychom
věděli, že nemáme žádná neuložená data, která by neměla být.
Transakce by měli běžet jen po nezbytně dlouhou dobu (tj. nečekají na
uživatele).
Pokud vás trápí počet spojení na server (tj. nechcete mít po celou dobu
jedno spojení pro každého uživatele) tak i uvolnění spojení po každém
requestu (hibernate.connection.release_mode=after_statement) . To ve
spojení s connection poolem nemá vliv na výkon, ale zkomplikuje to opět
práci s transakcemi.
Doporučuji základní dotazy provádět v AWT vlákně. Ty delší pak provádět
ve vedlejším vlákně. Pokud budete provádět dotazy ve druhém vlákně i pro
zobrazení seznamu pro uživatele, budete válčit s přehazováním objektů
mezi různými session.
Když si vyzkoušíte s tímto pracovat, přijde vám to po chvilce celé
docela příjemné na práci.
Petr Ferschmann
SoftEU s.r.o.
-----------------------------------
Bolevecká 6
301 00 Plzen
Czech Republic
-----------------------------------
Phone: +420 373 731 284
+420 373 729 300
Fax: +420 373 729 301
Cell: +420 775 638 008
E-mail: [EMAIL PROTECTED]