
Připojení dvou aplikací do jedné mysql databáze
Hoj,
potřebuji poradit.
Mám 2 aplikace:
a) Web app v hibernate
b) Destkop v javě
Aplikace a čte z databáze (pokaždé když někdo otevře stránku) a aplikace b do té databáze zapisuje (max 2x za den).
Jedná se o jednu tabulku do které obě aplikace přistupují. Obě přes stejný účet v mysql (přes roota).
Jak to vyřešit? Nemáte zkušenosti?
Díky za radu.
A co na tom chceš řešit? To je naprosto normální, že se do databáze přistupuje z více míst.
Problém je v tom, že když běží tomcat s webaplikací a a aplikace b chce zapsat data do databáze, tak se kousne a prostě je nezapíše. (dodatek: na webové rozhraní v danou chvilku nikdo nelezl - tudíž tomcat neměl potřebu číst z db).
Testoval jsem to i s vypnutým tomcatem a když je vypnutý, normálně to funguje.
Myslel jsem, že to je problém.
Aplikace nemá žadný cyklus a nemůže se jen tak kousnout.
Pseudokód:
Kousne se po Vypiš ukládám do db a Vypiš uloženo už nevypíše a data v db nejsou.
S vypnutým tomcatem vše OK.
to bude nejspíše problém toho JAK do té databáze zapisuješ (kolik a kam), jak je postaven datový a relační model databáze a v neposlední řadě (možná) problém (ne)indexace polí, popř. nějaký obecnější problém se zamykáním tabulek.
jak máš postavený SQL dotaz pro ukládání dat?
Jelikož se s tím teprve učím, mám pouze jednu tabulku.
Ukládám vždy 120 řádků.
Používám DriverManager z java.sql.
Tedy z kódu, dotaz je INSERT INTO NAZEVTABULKY (SLOUPEC1, SLOUPEC2, SLOUPEC3, SLOUPE4) VALUES (NECO, NECO, NECO, NECO);
insert do tabulky az taky problem nebude. skor to citanie. urobi zrejme table lock a uz mas problem.
ak pouzijes napriklad MyISAM engine, tak sa tomu vyhnes. pripadne urobis citanie bez zamknutia (co ma aj druhu stranku a to, ze budes citat aj necommitnute data).
O transakce se má starat servisní vrstva aplikace nezávisle na tom, co to je za DB. Do java kódu bych takové věci určitě necpal...
To je v poriadku, ale na tej servisnej vrstve to musis riesit rovnako.
Spravnym zamykanim zaznamov/tabuliek.
Len vytvorenim servisnej vrstvy, ktora obsahuje rovnaku logiku ako je teraz na aplikacnej vrstve nic nevyriesis.
Normálně se to dělá tak, že vytvoříš svoje backendové rozhraní pro práci s daty (třeba jako REST controllery) a toto rozhraní pak konzumuješ ve frontendových aplikacích.
My nevíme, jak v tomcatové aplikaci pracuješ s tou tabulkou, jak tam řešíš transakce (jestli tam třeba tu tabulku nezamykáš).
Používám hibernate.
O zamykání nic nevím, tudíž by být žádné nemělo.
Standardní uložení probíhá pomocí:
Vytvoření továrny při startu aplikace):
Následný save do databáze:
Název tabulek a dat se může zde lišit, ve skutečné aplikaci je vše OK
persistence je:
Co je to info_messageDao?
EDIT: Mas to hodne zmatene napsane. Proc vytvaris EntityManager sam? Jake vlastne pouzivas frameworky? Rikal jsi, ze ta hibernate aplikace jenom cte, ted tady vidim zapis.
Interface, přes který se ukládá objekt do db.
Dědí od třídy @MappedSuperclass.
Myslíš že bude problém v tom?
V hibernate mas mit jenom entitu, kterou chces ulozit. Je to trida, treba jako tato:
pak uz volas jenom em.persist(employee). Rizeni transkaci je dobre sverit nejake knihovne, treba Springu, at muzes pouzit anotaci @Transactional a nemusis pak furt psat begin, comit a rollback, kdyz exception.
O tom vím, děkuji, spring jsem nechtěl. O tom taky vím.
@Transactional používám.
EDIT: používám hibernate a JPA. Nepoužívám nic dalšího, protože nechci. Vím že to je.
EntityManager vytvarim z entity factory sám, protože je to ochrana proti vláknový práci.
Vím že to vypadá hrozně, ale teprve se to učím, pak přejdu výš na lepší knihovny.
Tohle asi ale nebude problém s DB, nebo myslíš že jo?
Problem bude v jave ne v DB. Dej sem cely kod, jak pracujes s daty...
Objekt, který ukládám do DB (+ dědění od základního BASEOBJECT):
Konkrétní uložení:
Kdy emf vytvářím při startu serveru takhle:
Generické DAO (v interfacu jsou jen hlavičky metod):
Konkrétní DAO objektu se kterým pracuji dědí od generického:
Konkrétní výběr který posílám pak v REQUESTU je:
emf je pořád stejný objekt, který posílám tam kde je třeba.