Tato stránka popisuje pokročilou variantu XML importu, která při nevhodném použití může vést k nekonsistenci dat!
Ve výchozím nastavení se každý import provádí jako jedna databázová transakce – tedy buď se uloží všechno nebo nic.
To je obvykle požadované chování a většinou není důvod na něm něco měnit. Může ovšem nastat situace, kdy transakční chování není nutné, pak lze atributem atomic
toto chování změnit.
<?xml version="1.0"?>
<winstrom version="1.0" atomic="false">
<faktura-vydana>
<id>code:123</id> ...
<polozkyFaktury>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
</polozkyFaktury>
</faktura-vydana>
<faktura-vydana>
<id>code:456</id> ...
<polozkyFaktury>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
</polozkyFaktury>
</faktura-vydana>
</winstrom>
Pokud nastavíte atribut atomic
na hodnotu false
, importuje se každý záznam v samostatné transakci. Tedy v příkladu výše proběhnou dvě databázové transakce, jedna pro fakturu 123
, druhá pro fakturu 456
. Položky jsou součástí faktury a tedy se importují ve stejné transakci, jako faktura samotná.
Jaký to přináší užitek? Když importujete velká XML s mnoha záznamy, transakce trvá dlouho a mnoho informací se musí držet v paměti. Obojí má nepříznivý vliv na výkon. Pokud je ale každý záznam samostatný a nevadí, že uložení některého z nich selže (např. když import pravidelně opakujete a/nebo dokážete v případě problémů zasáhnout ručně), můžete podstatně snížit paměťovou náročnost importu.
V případě opravdu velkých importů jsou paměťové nároky pro uchování ještě neuložených dat tak velké, že podstatnou část procesorového času začne zabírat garbage collector (to lze sledovat např. nástrojem jconsole
, který je standardní součástí vývojového prostředí JDK). V módu atomic="false"
se v takovém případě může razantně snížit i náročnost časová.