Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Witam,

Z poziomu Javy za pomocą JDBC łącze się do bazy Oracle 10g, wykonuję zapytanie i mierzę czas jego wykonania:


long startTime = System.nanoTime();
rs = stmt.executeQuery("select * from tabela1");
long resultTime = (System.nanoTime() - startTime)/1000000;


Zdarza się, że zapytanie trwa dość długo. W takim przypadku chcę ograniczyć czas wykonywania zapytania maksymalnie do np. 600000 [ms] - jeśli zostanie on przekroczony przerwać działanie wątku.

Próbowałam zrealizować to za pomocą innego wątku dla którego wywołuję sleep([max_time]). Nie wiem czy to dobra droga - wątek, który wykonuje zapytanie musi być niezależny od wątku, który przerywa jego działanie (timeout) po przekroczeniu maksymalnego czasu (tak mi się wydaje).

Proszę o sugestie/wskazówki jak rozwiązać problem z timeout'em.

Pozdrawiam,
Małgorzata B.Małgorzata Bąba edytował(a) ten post dnia 24.05.10 o godzinie 23:16
Adam Woźniak

Adam Woźniak software architect
and developer

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Małgorzata Bąba:
Witam,

Z poziomu Javy za pomocą JDBC łącze się do bazy Oracle 10g, wykonuję zapytanie i mierzę czas jego wykonania:


long startTime = System.nanoTime();
rs = stmt.executeQuery("select * from tabela1");
long resultTime = (System.nanoTime() - startTime)/1000000;


Zdarza się, że zapytanie trwa dość długo. W takim przypadku chcę ograniczyć czas wykonywania zapytania maksymalnie do np. 600000 [ms] - jeśli zostanie on przekroczony przerwać działanie wątku.

Próbowałam zrealizować to za pomocą innego wątku dla którego wywołuję sleep([max_time]). Nie wiem czy to dobra droga - wątek, który wykonuje zapytanie musi być niezależny od wątku, który przerywa jego działanie (timeout) po przekroczeniu maksymalnego czasu (tak mi się wydaje).

Proszę o sugestie/wskazówki jak rozwiązać problem z timeout'em.

Pozdrawiam,
Małgorzata B.Małgorzata Bąba edytował(a) ten post dnia 24.05.10 o godzinie 23:16

Może to pomoże (nie używałem, ale brzmi obiecująco):
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/State...

btw:
Jesli w tej tabeli "tabela1" masz wiele rowków, to robienie zapytania:
rs = stmt.executeQuery("select * from tabela1");

... chyba nie jest dobrym pomysłem, ponieważ (o ile pamietam), te tysiące / miliony rowków, które będa ładowane 'rs', w końcu wyczerpią pamięć Twojego procesu i cały proces zakonczy się z błedem i informacją o braku pamięci.

Pozdrawiam, Adam Woźniak

konto usunięte

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

W wersji najprostszej do zaimplementowania może być tak:

Thread queryThread = new Thread( new Runnable() {
public void run() {
long startTime = System.nanoTime();
ResultSet rs = stmt.executeQuery("select * from tabela1");
long resultTime = (System.nanoTime() - startTime)/1000000;
} );
queryThread.start();
queryThread.join( 5000 );


Nie spowoduje to jednak przerwania samego zapytania.Radosław A. edytował(a) ten post dnia 24.05.10 o godzinie 23:28
Bartosz T.

Bartosz T. Software Development
Engineer

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

a probowalas Statement.setQueryTimeout(int sec) ?

EDT. sorry juz bylo:)Bartosz T. edytował(a) ten post dnia 24.05.10 o godzinie 23:33

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Sprawdzałam już na początku funkcję setQueryTimeout(int sec), ale nic nie robi (nie jest zaimplementowana od strony bazy Oracle) :(

konto usunięte

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Małgorzata Bąba:
Próbowałam zrealizować to za pomocą innego wątku dla którego wywołuję sleep([max_time]). Nie wiem czy to dobra droga - wątek, który wykonuje zapytanie musi być niezależny od wątku, który przerywa jego działanie (timeout) po przekroczeniu maksymalnego czasu (tak mi się wydaje).

Proszę o sugestie/wskazówki jak rozwiązać problem z timeout'em.

Problem jest ciężki do rozwiązania, jeśli baza danych nie wspiera przerywania zapytań. Ja bym się takiego rozwiązania obawiał, gdyż nie wiem, co tak naprawdę dzieje się po stronie bazy danych lub API bazodanowego. Czy nie będzie gdzieś wycieku pamięci, czy baza danych przypadkiem nie będzie kontynuowała wykonania zapytania, tylko jego wyniki nigdzie nie trafią?

Może rozwiązanie tkwi w innym miejscu - może należy nałożyć jakiś index, nie pobierać wszystkich danych a tylko ID a potem ew. leniwie pobierać pozostałe dane? Albo po prostu pobierać tylko kilka kolumn zamiast wszystkich? Zadaj sobie pytanie jakie dane są Ci naprawdę potrzebne.

konto usunięte

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Zapytania, które trwają na prawdę długo to tylko mały procent zapytań i zwykle wiadomo, które konkretnie mogą tyle trwać (w danej aplikacji oczywiście).

Może w takim razie zapytania, które potencjalnie się długo wykonują powinny być odczytywane paczkami po kilkaset krotek (OFFSET, LIMIT, ROWCOUNT czy jakkolwiek się to robi na Oracle-u). Mam wrażenie, że niewiele to pomoże w przypadku zapytań gdzie jest grupowanie czy sortowania ale w przypadku takiego zapytania jak zostało podane to powinno rozwiązać sprawę. Przy takim podejściu sama decydujesz kiedy przerwać zapytanie.

Aha no i oczywiście to co napisał Dariusz ma największy sens i generalnie najpierw bym poszedł w tym kierunku (optymalizacja za pomocą indeksów).Pawel Dolega edytował(a) ten post dnia 25.05.10 o godzinie 10:56

konto usunięte

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Ja bym zaczął od ustalenia czy tak naprawdę jest to rzeczywisty problem, dotyczący rzeczywistego projektu, czy może jakieś eksperymenty badawcze, żeby sprawdzić jak długo zapytania wykonują się na bazie.

Jeśli eksperymenty to prawdę mówiąc nie znam rozwiązania na przerwanie trwającego zapytania (przynajmniej z poziomu JDBC), ale jeśli faktycznie masz problem w istniejącym systemie ze zbyt długimi zapytaniami, to nie tędy droga. W tym drugim przypadku zacząłbym od indeksowania (tak jak wspomnieli koledzy), a później szedł w stronę cache'owania tych wyników (np. w pamięci za pomocą memcached) albo denormalizacji schematu bazy, jeśli wąskim gardłem są JOINy. Tutaj już dużo zależy od tego na jak daleko idące kompromisy możesz iść w kwestii normalizacji schematu/redundancji danych albo modelu spójności. W rzeczywistych systemach z dużymi obciążeniami rezygnuje się często ze strict consistency na rzecz większej dostępności bazy. De facto, nie można mieć wszystkiego (zgodnie z twierdzeniem CAP). To m.in. jest powód, dla którego ostatnio coraz chętniej spogląda się w stronę rozwiązań zwanych popularnie NoSQL. Oczywiście radzenie sobie z realiami relacyjnych baz danych to temat-rzeka. Chciałem tutaj tylko zasygnalizować pewne możliwości.Michał Kalinowski edytował(a) ten post dnia 25.05.10 o godzinie 14:36

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Dziękuję serdecznie za rady, wskazówki :).
Co chcę osiągnąć? Chcę zbadać wydajnościowo bazę danych - założyłam, że mam co najmniej 100 wątków i każdy z nich wykonuje polecenie DML (są one oczywiście bardziej skomplikowane niż zamieściłam w przykładzie)

Zastanawiam się jeszcze czy nie można kill'ować sesji na bazie, gdy wątek wykonuje zapytanie bardzo długo?
Adam Woźniak

Adam Woźniak software architect
and developer

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Małgorzata Bąba:
Zastanawiam się jeszcze czy nie można kill'ować sesji na bazie, gdy wątek wykonuje zapytanie bardzo długo?

Z tego co wiem, to uzytkownik o wystarczających uprawnieniach na bazie danych, zawsze może "ubić" sesję po stronie bazy danych.

Pozdrawiam, Adam Woźniak

konto usunięte

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Osobiscie nie trawie baz relacyjnych. Poczulem sie jak mlody bog gdy przerzucilem sie na baze grafowa, neo4j. Miodzio ;]
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: Timeout przy wykonywaniu zapytania na bazie Oracle z...

Ja bym jeszcze dodał, że jeśli jest to Oracle 10g w wersji EE, to masz do dyspozycji Resource Managera, w którym można ustawić przeróżne limity zasobów. W szczególności możliwe jest ustawienie limit czasu na wykonanie operacji w sesji użytkownika. Po przekroczeniu tego czasu rzucany jest wyjątek, który aplikacja może obsłużyć (albo i nie ;P).

http://download.oracle.com/docs/cd/B14117_01/server.10...

pozdrawiam,
Paweł

Następna dyskusja:

Czas wykonania zapytania na...




Wyślij zaproszenie do