Naše databázová aplikace obsahuje dva druhy akcí – "interaktivní" a "na pozadí". Interaktivní jsou takové akce, které vyvolal uživatel a čeká na jejich výsledek (např. výpis záznamů). Akce na pozadí jsou spouštěny automaticky a provádějí různé dlouhotrvající práce (např. přepočet aktuálních úroků pro nový den). Téměř všechny akce na pozadí spouštíme v noci a žádný uživatel nečeká na výsledek.
Někdy je třeba spustit akce na pozadí i v době, kdy je systém vytížen interaktivními akcemi. V takových případech se může stát, že se běh interaktivních akcí zpomalí.
Tento problém můžeme jednoduše vyřešit vhodným nastavením priorit pro operační systém a využívat tak procesor a případně i IO aktivitu (přístup k disku) jen tehdy, nevyužívá-li je právě žádná interktivní akce.
Naše aplikace je složena z java programu a databáze. Musím poznamenat, že jak akce interaktivní tak akce na pozadí sdílejí stejnou databázi i stejný virtuální stroj (JVM).
Prioritu vlákna v javě snížíme takto:
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
Informace o implementaci vláken v JDK 5.0 najdete na stránkách Sunu.
Snížit prioritu určitého spojení PostgreSQL ovšem neumí. Proto si musíme pomoci vlastní funkcí.
CREATE FUNCTION setpriority (int4,int4,int4) RETURNS int4 AS '/lib/libc.so.6', 'setpriority' LANGUAGE 'C' ;
Pozn.: tato funkce bude fungovat jen na unixových systémech.
Využijeme implementaci funkce setpriority
v knihovně libc.
Nyní stačí pouze zavolat:
select setpriority(0,0,19);
Prioritu již nelze vrátit zpět na vyšší. Snížení priority se aplikuje jen na konkrétní vlákno/spojení. Pokud používáte tzv. connection pooling, potom je třeba spojení „zlikvidovat“ a nevracet zpět. Hrozí totiž, že by prioritu mohla převzít i interaktivní akce.
Poznámka: prioritizování IO mají systémy FreeBSD a Linux až od verze 2.6 – záleží ovšem na zvoleném IO elevatoru.