For det første den enkle løsning:Jeg ville dobbelttjekke, at antallet af standardlinks faktisk er i produktionsdatabasen. 4.
select *
from v$system_parameter
where name = 'OPEN_LINKS'
Forudsat at du ikke slipper så let:
Du siger, at du eksplicit lukker sessionen, hvilket ifølge dokumentationen , bør betyde, at alle links forbundet med den pågældende session er lukket. Bortset fra det indrømmer jeg fuldstændig uvidenhed på dette punkt.
Der er ingen ulemper, jeg kan komme i tanke om. Tom Kyte foreslår , omend for lang tid siden, at hvert åbent databaselink bruger 500k PGA-hukommelse. Hvis du ikke har nogen, vil dette naturligvis forårsage et problem, men det burde være mere end fint i de fleste situationer.
Der er dog utilsigtede konsekvenser:Forestil dig, at du øger dette tal til 100. Nogen koder noget, der konstant åbner links og trækker en masse data gennem dem alle select * from my_massive_table
eller lignende. I stedet for 4 sessioner, der gør dette, har du 100, som forsøger at overføre hundredvis af gigabyte samtidigt. Dit netværk dør under belastningen...
Der er sikkert mere, men du forstår billedet.
Som du har bemærket, er det bedste svar "sandsynligvis ikke", hvilket ikke er meget hjælp. Du nævner ikke præcis, hvordan du afslutter sessionen, men hvis du slår den ihjel i stedet for at lukke yndefuldt, så absolut.
Brug af et databaselink afføder en underordnet proces på fjernserveren. Fordi din server ikke længere er den absolutte kontrol over denne proces, er der et utal af ting, der kan forårsage, at den bliver forældreløs eller på anden måde ikke lukker ved afslutning af forældreprocessen. Dette sker på ingen måde hele tiden, men det kan og gør det.
Jeg ville gøre to ting.
-
Hvis du støder på en undtagelse under din proces, skal du e-maile resultaterne af følgende forespørgsel til dig selv.
select * from v$dblink
Som et minimum vil du vide, hvilke databaselinks der er åbne i sessionen og give dig en måde at spore dem på.
-
Følg dokumentationsrådene; specifikt følgende:
"Du kan have lejlighed til at lukke linket manuelt. For eksempel lukker links når:
- Netværksforbindelsen etableret af et link bruges sjældent i en applikation.
- Brugersessionen skal afsluttes."
Den første ser ud til at passe præcis til din situation. Medmindre din proces er tidsfølsom, hvilket ikke ser ud til at være tilfældet, hvad har du så at tabe? Syntaksen er:
alter session close database link <linkname>