2013-04-04 48 views
9

我有一个基于java的服务器(Tomcat),它使用JDBC连接来连接到Oracle数据库。有多种连接数据库的方法:SID,TNS名称,服务名称。在JDBC连接中使用TNS名称和服务名称之间的区别

我想了解是什么每个这些连接的和这将是如果连接到集群数据库推荐的连接(SID,TNS,或服务)之间的差。这里是我们对数据库的TNS名称:

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) 

    ) 

) 

) 

谢谢!

+1

只要只有一个主机名指定为你实际上没有任何区别。如果你连接到RAC(OPS)或DataGuard,那么是的。 SID是唯一的,不可更改并以数字结尾。虽然SERVICE_NAME可以出现在一个或多个节点上。它也可以在节点之间移动 – ibre5041 2013-04-05 09:44:28

+0

谢谢,很高兴知道。看到我下面的评论。我们有一个RAC。 – 2013-04-06 12:03:55

+1

如果您使用RAC,那么您应该为每个节点指定主机名。请参阅:http://stackoverflow.com/questions/13424385/oracle-connection-string-for-rac-environment – ibre5041 2013-04-06 17:59:57

回答

3

甲骨文SID是唯一的名称唯一标识您的实例/数据库,在那里作为服务名是你给的TNS别名当您远程连接到你的数据库,该服务名称被记录在tnsnames.ora文件在您的客户和它可以与SID相同,你也可以给它任何你想要的名字。

SERVICE_NAME是Oracle 8i中起,其中数据库可以用本身听众注册新功能。如果以这种方式向侦听器注册数据库,则可以在tnsnames.ora中使用SERVICE_NAME参数,否则 - 在tnsnames.ora中使用SID。

另外,如果您有OPS(RAC),则每个实例都会有不同的SERVICE_NAME。

SERVICE_NAMES指定数据库服务,此实例连接一个或多个名称。您可以指定多个服务名称以区分同一数据库的不同用途。例如:

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

您还可以使用的服务名称来识别单个服务,可从两个不同的数据库,通过使用复制的。

在Oracle Parallel Server环境中,必须为每个实例设置此参数。

TNS的是SQL *网络配置文件,它定义datbases地址建立连接它们。

+0

我们实际上有一个RAC,这就是我问的原因,因为如果我们失去一个数据库,它碰巧成为我指向的人,然后我们放弃这项服务。所以,基本上,你所说的是我需要指向TNS,以便它默认为正在工作的那个。那是对的吗? – 2013-04-06 11:59:55

+1

是的,这是正确的。在您的TNS中,您可以为您的RAC指定不同的节点。在这种情况下,如果您的某个节点出现故障,该服务仍然可用。 – TheEwook 2013-04-06 12:02:16

4

SERVICE_NAME是一个别名到数据库实例(或许多实例)。这样做的主要目的是如果你正在运行一个集群。使用这个我们可以连接集群内的特定数据库。和其他方式,我们可以连接到一个数据库实例,这是一个Oracle数据库实例的名称为的唯一的数据库实例。

总之,SID =您的数据库的唯一名称,SERVICE_NAME =连接时使用的别名。

有几种方法可以提供像直接指定,tnsnames.ora中(即TNS名称)的数据库信息,LDAP目录,网络信息服务。

甲TNS(Ť ransparent Ñ etwork 小号 ubstrate)名称是被保持在$ORACLE_HOME/network/admin
此文件中tnsnames.ora文件中的条目的名称包含一个用于由所述系统连接的信息到oracle数据库。使用这个客户端可以透明地获取与服务器相关的信息。它包含以下信息

PROTOCOL 
HOST IP ADDRESS 
PORTNO 
SID or SERVICE_NAME 

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

JDBC驱动程序使用TNS连接字符串连接如下

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); 
相关问题