Oracle
 sql >> Baza danych >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - Zbyt wiele linków do bazy danych... co to powoduje?

Po pierwsze, proste rozwiązanie:sprawdziłbym dwukrotnie, czy w produkcyjnej bazie danych liczba domyślnych linków jest właściwie 4.

select *
  from v$system_parameter
 where name = 'OPEN_LINKS'

Zakładając, że nie wyjdziesz tak lekko:

Mówisz, że wyraźnie zamykasz sesję, co zgodnie z dokumentacja , powinno oznaczać, że wszystkie linki powiązane z tą sesją są zamknięte. Poza tym przyznaję się do całkowitej ignorancji w tej kwestii.

Nie ma żadnych wad, o których mógłbym pomyśleć. Tom Kyte sugeruje , choć dawno temu, każde otwarte łącze do bazy danych zajmuje 500k pamięci PGA. Jeśli ich nie masz, spowoduje to oczywiście problem, ale w większości sytuacji powinno być więcej niż w porządku.

Istnieją jednak niezamierzone konsekwencje:Wyobraź sobie, że zwiększasz tę liczbę do 100. Ktoś koduje coś, co nieustannie otwiera linki i pobiera przez nie mnóstwo danych select * from my_massive_table lub podobne. Zamiast 4 sesji, które to robią, masz 100, co oznacza jednoczesne przesyłanie setek gigabajtów. Twoja sieć umiera pod obciążeniem...

Prawdopodobnie jest więcej, ale masz obraz.

Jak zauważyłeś, najlepszą odpowiedzią jest „prawdopodobnie nie”, co nie jest zbyt pomocne. Nie wspominasz dokładnie, w jaki sposób kończysz sesję, ale jeśli ją zabijasz, a nie zamykasz z wdziękiem, to zdecydowanie.

Użycie łącza do bazy danych tworzy proces potomny na zdalnym serwerze. Ponieważ twój serwer nie jest już bezwzględnie odpowiedzialny za ten proces, istnieje mnóstwo rzeczy, które mogą spowodować, że zostanie on osierocony lub w inny sposób nie zostanie zamknięty po zakończeniu procesu nadrzędnego. W żadnym wypadku nie zdarza się to przez cały czas, ale może i tak się dzieje.

Zrobiłbym dwie rzeczy.

  1. W swoim procesie, jeśli napotkasz wyjątek, wyślij do siebie e-mailem wyniki następującego zapytania.

    select * 
      from v$dblink
    

    Jako minimum będziesz wiedzieć, jakie łącza do baz danych są otwarte w trakcie sesji i w jakiś sposób możesz je śledzić.

  2. Postępuj zgodnie z poradami dotyczącymi dokumentacji; w szczególności następujące:

    „Możesz mieć okazję ręcznie zamknąć link. Na przykład zamknij linki, gdy:

    • Połączenie sieciowe ustanowione przez łącze jest rzadko używane w aplikacji.
    • Sesja użytkownika musi zostać zakończona."

Pierwszy wydaje się dokładnie pasować do twojej sytuacji. O ile twój proces nie jest czasochłonny, co nie wydaje się mieć miejsca, to co masz do stracenia? Składnia to:

alter session close database link <linkname>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać ucieczki nawiasów klamrowych dla Oracle

  2. AWS Python Lambda z Oracle - Generowanie OID nie powiodło się nawet po dodaniu HOSTALIASES

  3. Zaktualizuj kolumnę przy użyciu losowych unikalnych wartości z innej tabeli

  4. Jak wybrać dane, które nie pasują do innej kolumny?

  5. Lekka przygoda z zakupami