web-dev-qa-db-fra.com

Différence entre l'utilisation d'un nom TNS et d'un nom de service dans une connexion JDBC

J'ai un Java (Tomcat) qui se connecte à une base de données Oracle à l'aide d'une connexion JDBC. Il existe plusieurs façons de se connecter à la base de données: SID, nom TNS, nom de service.

Je voudrais comprendre quelle est la différence entre chacune de ces connexions et quelle serait la connexion recommandée (SID, TNS ou service) si vous vous connectez à une base de données en cluster. Voici le nom TNS que nous avons pour la base de données:

MY_Nice_TNS_NAME.MY_COMPANY.COM =

(DESCRIPTION =

  (ADDRESS = (PROTOCOL = TCP)(Host = myhostname)(PORT = 1521))

  (LOAD_BALANCE = YES)

  (CONNECT_DATA =

   (SERVER = DEDICATED)

   (SERVICE_NAME = MY_Nice_SERVICE_NAME.MY_COMPANY.COM)

   (FAILOVER_MODE =

   (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5)

   )

  )

)

Merci!

17
Luis Garcia

Oracle SID est le nom unique qui identifie de manière unique votre instance/base de données où comme nom de service est l'alias TNS que vous donnez lorsque vous vous connectez à distance à votre base de données et ce nom de service est enregistré dans le fichier Tnsnames.ora sur vos clients et il peut être le identique à SID et vous pouvez également lui donner tout autre nom que vous souhaitez.

SERVICE_NAME est la nouvelle fonctionnalité d'Oracle 8i à partir de laquelle la base de données peut s'enregistrer auprès de l'écouteur. Si la base de données est enregistrée auprès de l'écouteur de cette manière, vous pouvez utiliser le paramètre SERVICE_NAME dans tnsnames.ora sinon - utilisez SID dans tnsnames.ora.

De plus, si vous avez OPS (RAC), vous aurez un SERVICE_NAME différent pour chaque instance.

SERVICE_NAMES spécifie un ou plusieurs noms pour le service de base de données auquel cette instance se connecte. Vous pouvez spécifier plusieurs noms de services afin de distinguer les différentes utilisations de la même base de données. Par exemple:

SERVICE_NAMES = sales.acme.com, widgetsales.acme.com

Vous pouvez également utiliser des noms de service pour identifier un seul service qui est disponible à partir de deux bases de données différentes via l'utilisation de la réplication.

Dans un environnement Oracle Parallel Server, vous devez définir ce paramètre pour chaque instance.

Le TNS est le fichier de configuration sql * net qui définit l'adresse des bases de données pour établir la connexion avec elles.

7
TheEwook

SERVICE_NAME est un alias vers une instance de base de données (ou plusieurs instances). Le but principal de ceci est si vous exécutez un cluster. En utilisant cela, nous pouvons connecter une base de données spécifique au sein d'un cluster. Et d'une autre manière, en utilisant SID ( S ystem ID entifier ), nous pouvons nous connecter à une instance de base de données, qui est un nique nom pour une instance de base de données Oracle.

En bref, SID = le nom unique de votre base de données, SERVICE_NAME = l'alias utilisé lors de la connexion.

Il existe plusieurs façons de fournir des informations de base de données comme Directly Specified, tnsnames.ora (c'est-à-dire le nom TNS), LDAP Directory, Network Information Services.

A TNS ( T transparent N etwork S ubstrate) name est le nom de l'entrée dans tnsnames.ora fichier conservé dans $Oracle_HOME/network/admin
Ce fichier contient les informations utilisées par le système pour se connecter à la base de données Oracle. En utilisant cela, un client peut récupérer les informations associées au serveur de manière transparente. Il contient les informations suivantes

PROTOCOL
Host IP ADDRESS
PORTNO
SID  or SERVICE_NAME

Par exemple

 mydb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = 10.35.15.1)(PORT = 1521))
    (CONNECT_DATA = (SID = mydb))

Les pilotes JDBC se connectent avec une chaîne de connexion à l'aide de TNS comme suit

System.setProperty("Oracle.net.tns_admin", PATH_TO_TNSNAMES.ORA);
Class.forName ("Oracle.jdbc.OracleDriver");
dbUrl = "jdbc:Oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host="+IPHOST+")(PORT="+PORT+"))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME="+DBNAME+")))"

conn = DriverManager.getConnection(dbUrl, USERNAME, PASSWORD);
11
Premraj