Jak rozwiązać sytuację wielkiej ilości zapytań do bazy w ramach jednego obiektu

0

Witam,

Implementuję pewną usługę której głównym zadaniem jest pobieranie oraz zapisywanie danych między innymi z oraz do bazy danych. Baza danych składa się z ogromnej ilości relacji. Pojawił się taki problem. Jedną z funkcjonalności jest wykonanie update/insert na pewnych danych otrzymanych na wejściu (jeden obiekt zawierający w sobie wszystkie dane). update/insert na danych ma być wykonany tylko w przypadku kiedy otrzymaliśmy jakąś daną na wejściu (opcjonalnie). Problem mój polega na tym, że zastanawiam się jak rozwiązać sytuacje kiedy mam bardzo dużo danych do zapisania/uaktualnienia z czym wiąże się wykonanie wielu oddzielnych zapytań do bazy (dane są w relacji z bardzo wieloma tabelkami). Nie mogę wyobrazić sobie jednej funkcji która wykonuję po kolei załóżmy 20 zapytań do bazy (na dodatek zależnie od tego czy w bazie były już dane (update) lub nie (insert), plus warunek jeśli dana != null) to się wydaje totalnie głupie. Bardziej logiczne wydaje się robić 20 oddzielnych funkcji wykonujących zapytanie ale z drugiej strony będą one użyte tylko i wyłącznie w jednym miejscu. Potrzebuje porady jak w najlepszy sposób to rozwiązać? W razie potrzeby mogę dokładniej przybliżyć problem.

Dodam, że do pracy z bazą używam springowego jdbcTemplate.

0

A nie można zrobić tego z poziomu aplikacji, która łączy się z bazą danych ? Tzn. sprawdzenia czy dana nie jest nullem.

0

Akurat problem sprawdzenia czy dana nie jest nullem to problem że tak powiem drugorzędny. Po pierwsze insert/update będzie wykonany tylko jeśli dana na wejściu nie będzie nullem, po drugie czy to będzie insert czy update będzie zależało od tego czy w bazie już istnieje obiekt o zadanych kryteriach, jesli istnieje update, jesli nie insert (prawdopodobnie identyfikowany przez jakiś id). Największy "problem" jest w ilośći wykonywanych updatów/selectów w ramach jednej funkcjonalności

0

napisz stored proc po stronie bazy - zmniejszysz ruch sieciowy i czas wykonania. Dodatkowo wiele baz ma konstrukcję typu INSERT OR REPLACE czy INSERT OR UPDATE - nie napisałeś jaką Ty masz więc nie pomogę w tym względzie

0

Jak to już przy optymalizacjach, opcji jest kilka:
0. Jeśli problem dotyczy dużej liczby INSERT/UPDATE/DELETE, to można spróbować batchować dane (np. jdbcTemplate zdaje się mieć coś w stylu batchUpdate0).

  1. Jeśli problem sprowadza się do dużej liczby SELECTów, to można spróbować całą logikę walidacji opakować w procedurę wykonywaną po stronie bazy danych, zwracającą tylko wynik walidacji.
  2. Można też spróbować zredukować liczbę SELECTów stosując sztuczki typu UNION, LEFT JOIN itp.
  3. Opcją nuklearną jest przeniesienie całości do procedur bazodanowych.
  4. W takim przypadku warto się zastanowić też, jaki poziom wydajności Ciebie zadowala, żeby nie przesadzić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1