Strona 1 z 11


21 Gru 2007, 18:04
Oracle

Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie znalazłem
takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
posiadających transakcje działające dłużej niż n czasu? Poniżej przedstawiam
procedurę, którą odpalam w job-ie:

CREATE OR REPLACE PROCEDURE SYS.kill_old_transactions
IS
   CURSOR cur
   IS
      SELECT s.SID, s.serial# serial, t.start_date
        FROM v$transaction t, v$session s
       WHERE s.saddr = t.ses_addr;

   d       DATE;
   res     NUMBER;
   QUERY   VARCHAR2 (100);
BEGIN
   FOR c IN cur
   LOOP
      SELECT SYSDATE
        INTO d
        FROM DUAL;

      res :=
           TO_NUMBER (TO_CHAR (d, 'SSSSS'))
         - TO_NUMBER (TO_CHAR (c.start_date, 'SSSSS'));

      IF (res 30)
      THEN
         QUERY :=
            'alter system kill session ''' || c.SID || ', ' || c.serial
            || '''';

         EXECUTE IMMEDIATE (QUERY);
      END IF;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      -- Consider logging the error and then re-raise
      RAISE;
END kill_old_transactions;
/




22 Gru 2007, 06:49
Wojciech Malinowski


Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie znalazłem
takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
posiadających transakcje działające dłużej niż n czasu? Poniżej przedstawiam
procedurę, którą odpalam w job-ie:



Nie rozumiem do czego to mogłoby być potrzebne. Chyba, że to maszyna
developerska i programiści często uruchamiają nieskończone pętle.

Jeżeli to maszyna produkcyjna to przecież każda sesja do czegoś w końcu
służy, więc ubijając ją coś zepsujesz użytkownikowi.

CREATE OR REPLACE PROCEDURE SYS.kill_old_transactions



Czy ta procedura w jakimś szczególnym przypadku nie ubije sama siebie?

Pozdrawiam,
Wojciech Malinowski


22 Gru 2007, 09:44
Marcin Wróblewski


Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie znalazłem
takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
posiadających transakcje działające dłużej niż n czasu? Poniżej
przedstawiam
procedurę, którą odpalam w job-ie:

CREATE OR REPLACE PROCEDURE SYS.kill_old_transactions
IS
   CURSOR cur
   IS
      SELECT s.SID, s.serial# serial, t.start_date
        FROM v$transaction t, v$session s
       WHERE s.saddr = t.ses_addr;

   d       DATE;
   res     NUMBER;
   QUERY   VARCHAR2 (100);
BEGIN
   FOR c IN cur
   LOOP
      SELECT SYSDATE
        INTO d
        FROM DUAL;

      res :=
           TO_NUMBER (TO_CHAR (d, 'SSSSS'))
         - TO_NUMBER (TO_CHAR (c.start_date, 'SSSSS'));

      IF (res 30)
      THEN
         QUERY :=
            'alter system kill session ''' || c.SID || ', ' || c.serial
            || '''';

         EXECUTE IMMEDIATE (QUERY);
      END IF;
   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      -- Consider logging the error and then re-raise
      RAISE;
END kill_old_transactions;
/

" Czy dobrym rozwiązaniem jest zabijanie sesji posiadających transakcje
działające dłużej niż n czasu? "

- nie. Każde ubicie sesji powinno być rozważone indywidualnie. Dlaczego
uważasz, że należy ubijać wszystko, co trwa dłużej niż n sekund?


22 Gru 2007, 11:36
Sławomir Szyszło


wklepał(-a):
Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie znalazłem
takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
posiadających transakcje działające dłużej niż n czasu? Poniżej przedstawiam
procedurę, którą odpalam w job-ie:



Można to limitować w profilu użytkownika:
http://www.adp-gmbh.ch/ora/sql/create_profile.html

Jeśli chcesz ograniczać wykorzystanie zasobów to raczej Resource Manager:
http://www.adp-gmbh.ch/ora/resource_manager/

nie jest dobrym pomysłem.




22 Gru 2007, 17:14
free...@autograf.pl


wklepał(-a):

| Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie znalazłem
| takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
| posiadających transakcje działające dłużej niż n czasu? Poniżej przedstawiam
| procedurę, którą odpalam w job-ie:

Można to limitować w profilu użytkownika:
http://www.adp-gmbh.ch/ora/sql/create_profile.html

Jeśli chcesz ograniczać wykorzystanie zasobów to raczej Resource Manager:
http://www.adp-gmbh.ch/ora/resource_manager/

nie jest dobrym pomysłem.


22 Gru 2007, 18:53
Przemysław Rachwał


| wklepał(-a):

| Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie znalazłem
| takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie sesji
| posiadających transakcje działające dłużej niż n czasu? Poniżej przedstawiam
| procedurę, którą odpalam w job-ie:
| Można to limitować w profilu użytkownika:
| http://www.adp-gmbh.ch/ora/sql/create_profile.html

| Jeśli chcesz ograniczać wykorzystanie zasobów to raczej Resource Manager:
| http://www.adp-gmbh.ch/ora/resource_manager/

| nie jest dobrym pomysłem.
| --

| Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
| FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
| Archiwum http://groups.google.com/groups?group=pl.comp.bazy-danych

Niestety w profilach nie można ograniczyć. O czymś takim jak Resource Manager
nie słyszałem. A co do zabijania sesji posiadających długie transakcje, to
chciałem wykorzystać takie rozwiązanie, gdyż wszystkie transakacje normalnie
zajmują < 10 sekund. Niestety raz na ok 3 miesiące przestaje działać aplikacja,
prawdopodobnie dlatego, że wyczerpują sie połączenia z puli połączeń. Pula
wyczerpuje sie prawdopodobnie dlatego, że gdzieś pojawia się blokada i ona
powoduje wiszenie połączeń na transakcjach. Dlatego, gdy transkacja trwa więcej
niż np minutę to nie jest to normalna sytuacja i taka transakcja się nie y
commit-uje i dlatego wolałbym, aby wywaliło się jedno żądanie niż cała aplikacja.

  czemu nie szukasz przyczyny błędu a leczysz objawy? to takie nie koszerne


23 Gru 2007, 04:29
Marcin Wróblewski


| wklepał(-a):

| Witam, chciałbym ograniczyć długość transakcji na oracle, ale nie
znalazłem
| takiej mozliwości na  oraclu. Czy dobrym rozwiązaniem jest zabijanie
sesji
| posiadających transakcje działające dłużej niż n czasu? Poniżej
przedstawiam
| procedurę, którą odpalam w job-ie:

| Można to limitować w profilu użytkownika:
| http://www.adp-gmbh.ch/ora/sql/create_profile.html

| Jeśli chcesz ograniczać wykorzystanie zasobów to raczej Resource Manager:
| http://www.adp-gmbh.ch/ora/resource_manager/

trwan
ia
| nie jest dobrym pomysłem.
| --

| Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych
| FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/
| Archiwum http://groups.google.com/groups?group=pl.comp.bazy-danych

Niestety w profilach nie można ograniczyć. O czymś takim jak Resource
Manager
nie słyszałem. A co do zabijania sesji posiadających długie transakcje, to
chciałem wykorzystać takie rozwiązanie, gdyż wszystkie transakacje
normalnie
zajmują < 10 sekund. Niestety raz na ok 3 miesiące przestaje działać
aplikacja,
prawdopodobnie dlatego, że wyczerpują sie połączenia z puli połączeń. Pula
wyczerpuje sie prawdopodobnie dlatego, że gdzieś pojawia się blokada i ona
powoduje wiszenie połączeń na transakcjach. Dlatego, gdy transkacja trwa
więcej
niż np minutę to nie jest to normalna sytuacja i taka transakcja się nie y
commit-uje i dlatego wolałbym, aby wywaliło się jedno żądanie niż cała
aplikacj
a.

"prawdopodobnie", "gdzieś", ... - nie uważasz, że zanim zastosuje się tak
drastyczne środki, trzeba najpierw dokładnie zidentyfikować problem? Wtedy
zresztą okaże się "prawdopodobnie", że te drastyczne środki nie są potrzebne


23 Gru 2007, 10:16
Sławomir Szyszło


Niestety w profilach nie można ograniczyć. O czymś takim jak Resource Manager
nie słyszałem.



W profilu możesz ustawić maksymalne użycie procesora na sesję lub "call" -
cokolwiek by to znaczyło. :)

W Resource Manager tworzysz grupy użytkowników i przydzielasz im określony
procent zasobów procesora. Grupy są zależne od siebie, tj. jeśli grupa o wyższym
priorytecie nie wykorzystuje całej mocy procesora, to niewykorzystana część
przechodzi do kolejnej grupy.


23 Gru 2007, 10:18
Sławomir Szyszło


Niestety w profilach nie można ograniczyć. O czymś takim jak Resource Manager
nie słyszałem. A co do zabijania sesji posiadających długie transakcje, to
chciałem wykorzystać takie rozwiązanie, gdyż wszystkie transakacje normalnie
zajmują < 10 sekund. Niestety raz na ok 3 miesiące przestaje działać aplikacja,
prawdopodobnie dlatego, że wyczerpują sie połączenia z puli połączeń. Pula
wyczerpuje sie prawdopodobnie dlatego, że gdzieś pojawia się blokada i ona
powoduje wiszenie połączeń na transakcjach. Dlatego, gdy transkacja trwa więcej
niż np minutę to nie jest to normalna sytuacja i taka transakcja się nie y
commit-uje i dlatego wolałbym, aby wywaliło się jedno żądanie niż cała aplikacja.



Aha, wzajemnie blokujące się sesje nie jest trudno znaleźć, tym bardziej jeśli
ma się narzędzie typu TOAD. Sprawdź może najpierw czy wszystkie klucze obce
posiadają stosowne indeksy, bo brak indeksu będzie powodował blokadę przy np.
wstawianiu i usuwaniu przez różnych użytkowników.

23 Gru 2007, 18:35
Maseł



[...]
Aha, wzajemnie blokujące się sesje nie jest trudno znaleźć, tym bardziej jeśli
ma się narzędzie typu TOAD. Sprawdź może najpierw czy wszystkie klucze obce
posiadają stosowne indeksy, bo brak indeksu będzie powodował blokadę przy np.
wstawianiu i usuwaniu przez różnych użytkowników.



Wystarczy SQLPlus (TOAD robi zreszta dokladnie to samo)

SQLdesc v$session
 Nazwa                                     Wartość NULL? Typ
 ----------------------------------------- --------
----------------------------
[...]
 BLOCKING_SESSION_STATUS                            VARCHAR2(11)
 BLOCKING_INSTANCE                                  NUMBER
 BLOCKING_SESSION                                   NUMBER
[...]

Pozdro

Maseł


28 Gru 2007, 01:41
Marek Chwojnicki


[...]
| Aha, wzajemnie blokujące się sesje nie jest trudno znaleźć, tym bardziej jeśli
| ma się narzędzie typu TOAD. Sprawdź może najpierw czy wszystkie klucze obce
| posiadają stosowne indeksy, bo brak indeksu będzie powodował blokadę przy np.
| wstawianiu i usuwaniu przez różnych użytkowników.

Wystarczy SQLPlus (TOAD robi zreszta dokladnie to samo)

SQLdesc v$session
 Nazwa                                     Wartość NULL? Typ
 ----------------------------------------- --------
----------------------------
[...]
 BLOCKING_SESSION_STATUS                            VARCHAR2(11)
 BLOCKING_INSTANCE                                  NUMBER
 BLOCKING_SESSION                                   NUMBER
[...]

W Oracle9i a pewnie i innych wersjach, jest do tego fajny skrypcik:
  $ORACLE_HOME/rdbms/admin/utllockt.sql

Po wywołaniu (warto zwiększyć sobie rozmiar linii do 150-200) pokazuje
ładnie w postaci drzewa sesje - która na którą czeka.

Pozdrawiam,
Trolu



Strona 1 z 11


Podobne tematy

Oracle - od czego zaczac, szukam , ale czego ?
Oracle exp-imp error 3113
oracle nie moze rozszerzyc zegmentu wycofan
Oracle, co oznacza "przeliczenie planów"
Baza Oracle w trybie standby
Oracle a logowanie zapytań
Oracle i SQL-DMO
MSSQL vs ORACLE
Baza Oracle + Designer6i
Oracle + Internet
Oracle8iEnterprise,RedHat8i,po
Ksi¹¿ka do Oracle
daty w oracle
Oracle 9.2.0.1 + Patch 9.2.0.3
Pomysl na parametryzowanie view - da rade?
Lista wypowiedzi z for dyskusyjnych - Indeks
Odnośniki,