[Java lista] Prepared JPA Query
Hortobágyi László
laszlo.hortobagyi at dataexplorer.hu
2009. Aug. 4., K, 10:57:08 CEST
nem javás a megközelítés, de ilyen esetben az alábbi lehetőségek vannak:
- tárolt eljárásban csináld az update-insert műveletét. Az adott motor tudni fogja az optimalizált beszúrás lehetőségét
- ha nem túlságosan nagy az elemszám (300 ezer rekord még nem annyira horribilis) tárold a kulcslistát a memóriában, és java oldalon végezd el a lista ellenőrzést. Ez insert előtt egy feltöltés, insert alatt memória művelet, ezt még a java is gyorsan csinálja :)
- én pl. összevonnám a master-detail ellenőrzést egy selectbe, ennyivel is gyorsabb :)
- végezz utólagos ellenőrzést. Beolvasás egy temp táblába, majd SQL utasításokkal végezd el a tényleges adatkezelést (temp-tábla cél-tábla különbségek => új rekordok; azonos elemek => update )
Most hirtelen ennyi :)
HoLa
-----Original Message-----
From: javalist-bounces at javagrund.hu [mailto:javalist-bounces at javagrund.hu] On Behalf Of Szomor Attila
Sent: Tuesday, August 04, 2009 10:26 AM
To: javalist at javagrund.hu
Subject: [Java lista] Prepared JPA Query
Sziasztok,
CSV-bol importálni kellene adott rendszerességgel különböző törzsadat
frissítéseket:
1, Kell egy ellenőrzés, hogy már létezik-e, ha igen update
2, ha nem létezett, egy másik ellenőrzés, hogy az Ő master-e létezik-e,
ha igen felvesszük
látszőlag roppant egyszerű, két Query és egy em.persist vagy egy em.update.
Az alap kódtörzsben 5000 (WHO) kód van és ehhez egy kapcsolat 282000
(WHO_Competencia)adatot rendelne,
ez első megközelítésben 12 órát futott ebből a CSV olvasás és parse 1.5mp
az em.persist kb 20perc, a két select és a log kb. 11 óra 40perc.
A logból az látszik, hogy a (A vagy B)Query.setParameter(1,
whoxWhoCom.getWhoCwho()); 0.016mp minden alkalommal, most egy első
feltöltésnél ez
282000 * 2 * 0.016mp = 9024mp az az 150.4perc.
Ez Delphi-vel 4 prepared statement-el (2 select, 1 insert, 1 uopdate) nem
egész 3 percig tart, gondoltam, hogy egy interpretált nyelv a közelébe sem
érhet, de hogy ennyire nem az gáz !!!
A JPA Query-kre nem találtam prepare lehetőséget, gondoltam egyet durván
megkerülöm az em-t aztán gyerünk prepareStatement, az update kersés
kihagyva, csak az insert-re koncentrálva 15perc, hát ez lehangoló !!!
Hogy importáltok java-ból ???
Attila.
ORIG 12ora
----------
AQuery = em.createNamedQuery(..);
BQuery = em.createNamedQuery(..);
while (!reader.isEof()) {
parseLine();
AQuery.setParameter(1, whoxWhoCom.getWhoCwho());
AQuery.setParameter(2, whoxWhoCom.getWhoSzmk());
AQuery.getResultList();
if ... {
em.merge(entity);
| else {
BQuery.setParameter(1, whoxWhoCom.getWhoCwho());
BQuery.getResultList();
if ... {
em.persist(entity);
}
}
reader.ReadNextLine();
}
NEW 15p
-------
conn = ds.getConnection();
stmt = conn.prepareStatement("SELECT e.id,e.szcod FROM beavatk_szekszard e
WHERE e.szcod = ?");
while (!reader.isEof()) {
parseLine();
stmt.setString(1, whoxWhoCom.getWhoCwho());
rs = stmt.executeQuery();
if ((rs != null) && rs.next()) {
BigDecimal id = rs.getBigDecimal(1);
if (id != null) {
beavatkSzekszard.setId(id.toBigInteger());
beavatkSzekszard.setSzcod(rs.getString(2));
}
}
rs.close();
if ... {
em.persist(entity);
}
reader.ReadNextLine();
}
_______________________________________________
Javalist mailing list
Javalist at javagrund.hu
http://javagrund.hu/mailman/listinfo/javalist
További információk a(z) Javalist levelezőlistáról