Om deze fout correct op te lossen en verbinding te maken met de juiste Oracle-database, moeten we een beetje uitleggen hoe Oracle zich gedraagt en dus wat dit probleem in de eerste plaats veroorzaakt.
SID's versus SERVICE_NAMES
Het is belangrijk om het (kleine) verschil te begrijpen tussen wat Oracle definieert als een SID
vergeleken met een SERVICE_NAME
, aangezien we deze informatie later zullen gebruiken om een goede verbindingsreeks te maken.
In Oracle is de systeem-ID (of SID
) is een lokale identificatiecode van maximaal acht tekens die wordt gebruikt om een bepaalde database te identificeren en te onderscheiden van andere databases op het systeem.
Vaak is de SID
is het voorvoegsel woord of DB_UNIQUE_NAME
die voorafgaat aan de DB_DOMAIN
. Bijvoorbeeld de SID
van onze bookstore
database, zoals te zien in de volledige global database name
van bookstore.company.com
.
SERVICE_NAMES
, aan de andere kant, vertegenwoordigen de namen waarmee database-instanties kunnen worden verbonden. Een SERVICE_NAME
zal doorgaans het formaat van de SID
. volgen gevolgd door het databasedomein, zoals:DB_UNIQUE_NAME.DB_DOMAIN
De TNS-luisteraar
Wanneer een client probeert verbinding te maken met een Oracle-database, in plaats van rechtstreeks met de database te verbinden , is er een makelaarsdienst die tussenbeide komt en het verbindingsverzoek voor de klant afhandelt.
Deze broker-applicatie staat bekend als de listener
en het voert de taak uit van luisteren voor inkomende klantverzoeken. Wanneer een verzoek wordt ontvangen, zal de listener
verwerkt en stuurt dat verzoek door naar de juiste Oracle-databaseserver met behulp van een service handler
, die alleen fungeert als de verbinding tussen de listener
en de databaseserver.
TNS-namen en configuratie
Wanneer u verbinding maakt met een Oracle-database, heeft uw databaseserver doorgaans tnsnames.ora
, een configuratiebestand dat de server informeert over NET_SERVICE_NAMES
die geldige databaseverbindingen zijn. Dit bestand bevindt zich standaard op ORACLE_HOME/network/admin
.
Bijvoorbeeld een NET_SERVICE_NAME
descriptor in tnsnames.ora
kan als volgt worden opgemaakt:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Dit zou een NET_SERVICE_NAME
definiëren met behulp van de SERVICE_NAME
we eerder hebben besproken (bookstore.company.com
) en verbinding maken met localhost
via poort 1521
.
Verbindingsreeks
Met wat meer kennis over hoe Oracle daadwerkelijk verbinding maakt met databases, kunnen we nu bekijken hoe connection strings
zijn geformatteerd.
Verbinden via TNS-naam/NET_SERVICE_NAME
Bij verbinding via een NET_SERVICE_NAME
zoals gespecificeerd in uw tnsnames.ora
config-bestand, moet u de username
. gebruiken , password
en voeg vervolgens de NET_SERVICE_NAME
. toe met de @
symbool, zoals zo:
username/password@NET_SERVICE_NAME
Dus voor onze vorige NET_SERVICE_NAME
descriptor hierboven, de werkelijke NET_SERVICE_NAME
we gedefinieerd was myDatabaseNetService
, dus onze verbindingsreeks kan er ongeveer zo uitzien:
john/Hunter2@myDatabaseNetService
Verbinden via SERVICE_NAME
Bij verbinding via een SERVICE_NAME
, moet u ook de host
. toevoegen en port
, samen met de /
symbool voorafgaand aan de SERVICE_NAME
zelf:
username/password@host:port/SERVICE_NAME
Verbinden via SID
Tot slot, als verbinding wordt gemaakt zonder een geconfigureerde NET_SERVICE_NAME
of zelfs SERVICE_NAME
, kunt u dit rechtstreeks doen via de SID
door de :
. te gebruiken symbool in plaats van de /
symbool zoals bij de SERVICE_NAME
verbindingsreeks:
username/password@host:port:SID