Navrhoval bych zařadit všechny akce SQL z více vláken do nějaké mezilehlé datové struktury a poté je vložit do databáze z jednoho vlákna. Je možné mít pro vlákna bezpečné mezilehlé struktury jako ConcurrentHashMap
, ConcurrentLinkedQueue
nebo se můžete při práci s ním jen synchronizovat.
Tímto způsobem dokonce nemusíte zahájit transakci předem. Nevyřízená data mohou být méně bezpečná, ale předpokládám, že v databázi nejsou o mnoho bezpečnější, dokud transakce ještě není potvrzena.
To samozřejmě může fungovat pouze v případě, že nemáte select
výpisy vybírající data o nepotvrzené transakci ze stejné transakce. Zbavit se takových dotazů tak či onak může vyžadovat přepracování.
Použijte CountDownLatch
zjistit, kdy jsou všechna data připravena a vlákno zápisu databáze by mělo zahájit svou akci. Pokud se tak nestane, použijte pro vlákno zápisu databáze vzor reaktoru.