25

我有一个基于 Java 的服务器 (Tomcat),它使用 JDBC 连接连接到 Oracle 数据库。连接数据库有多种方式:SID、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)

   )

  )

)

谢谢!

4

2 回答 2

16

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

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

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

TNS(透明网络底层名称是保存在文件中的条目的名称,该文件 包含系统用于连接到 oracle 数据库的信息。使用它,客户端可以透明地获取服务器相关信息。它包含以下信息 tnsnames.ora$ORACLE_HOME/network/admin

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);
于 2015-12-12T11:30:03.427 回答
9

Oracle 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*net 配置文件,它定义数据库地址以建立与它们的连接。

于 2013-04-04T18:59:34.193 回答