Sugerowałbym zakolejkowanie wszystkich akcji SQL z wielu wątków w jakiejś pośredniej strukturze danych, a następnie umieszczenie ich w bazie danych z jednego wątku. Możliwe jest posiadanie bezpiecznych dla wątków struktur pośrednich, takich jak ConcurrentHashMap
, ConcurrentLinkedQueue
lub możesz po prostu zsynchronizować się podczas pracy z nim.
W ten sposób nie musisz nawet rozpoczynać transakcji z wyprzedzeniem. Oczekujące dane mogą być mniej bezpieczne, ale zakładam, że nie są one dużo bezpieczniejsze w bazie danych, gdy transakcja nie została jeszcze zatwierdzona.
Oczywiście może to działać tylko wtedy, gdy nie masz opcji select
wyciągi pobierając dane niezatwierdzonych transakcji z tej samej transakcji. Pozbycie się takich zapytań w taki czy inny sposób może wymagać przeprojektowania.
Użyj CountDownLatch
aby wykryć, kiedy wszystkie dane są gotowe i wątek zapisu bazy danych powinien rozpocząć swoją akcję. Jeśli nigdy się to nie stanie, użyj wzorca reaktora dla wątku zapisu bazy danych.