Първо, простото решение:бих проверил отново дали в производствената база данни броят на връзките по подразбиране е всъщност 4.
select *
from v$system_parameter
where name = 'OPEN_LINKS'
Ако приемем, че няма да се отървете толкова леко:
Казвате, че изрично затваряте сесията, което според документацията , трябва да означава, че всички връзки, свързани с тази сесия, са затворени. Освен това признавам пълно невежество по този въпрос.
Няма никакви недостатъци, за които мога да се сетя. Том Кайт предлага , макар и преди много време, че всяка отворена връзка към база данни използва 500k PGA памет. Ако нямате такива, това очевидно ще създаде проблем, но би трябвало да е повече от добре за повечето ситуации.
Има обаче непредвидени последици:Представете си, че сте увеличили това число до 100. Някой кодира нещо, което непрекъснато отваря връзки и извлича много данни през всички тях select * from my_massive_table
или подобни. Вместо 4 сесии, които правят това, имате 100, които се опитват да прехвърлят стотици гигабайти едновременно. Вашата мрежа умира под напрежение...
Вероятно има още, но схващате картината.
Както отбелязахте, най-добрият отговор е „вероятно не“, което не е от голяма полза. Не споменавате как точно прекратявате сесията, но ако я убивате, вместо да затваряте елегантно, тогава определено.
Използването на връзка към база данни създава дъщерен процес на отдалечения сървър. Тъй като вашият сървър вече не отговаря напълно за този процес, има безброй неща, които могат да го накарат да остане сирак или по друг начин да не се затвори при прекратяване на родителския процес. В никакъв случай това не се случва през цялото време, но може и става.
Бих направил две неща.
-
По време на вашия процес, ако възникне изключение, изпратете по имейл резултатите от следната заявка до себе си.
select * from v$dblink
Най-малкото ще знаете какви връзки към бази данни са отворени в сесията и ще ви даде някакъв начин да ги проследите.
-
Следвайте съветите в документацията; конкретно следното:
„Може да имате случай да затворите връзката ръчно. Например затворете връзките, когато:
- Мрежовата връзка, установена чрез връзка, се използва рядко в приложение.
- Потребителската сесия трябва да бъде прекратена."
Първото изглежда точно отговаря на вашата ситуация. Освен ако вашият процес не е чувствителен към времето, което изглежда не е така, тогава какво можете да загубите? Синтаксисът е:
alter session close database link <linkname>