【问题标题】:Difference between using a TNS name and a service name in a JDBC connection在 JDBC 连接中使用 TNS 名称和服务名称的区别
【发布时间】:2013-03-27 00:18:36
【问题描述】:

我有一个基于 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)

   )

  )

)

谢谢!

【问题讨论】:

  • 只要您只指定一个主机名,几乎没有区别。如果您连接到 RAC(OPS) 或 DataGuard,那么可以。 SID 是唯一的,不可更改并以数字结尾。虽然 SERVICE_NAME 可以存在于一个或多个节点上。并且它还可以在节点之间移动
  • 谢谢,很高兴知道。请参阅下面的评论。我们确实有 RAC。
  • 如果您使用 RAC,那么您应该为每个节点指定主机名。见:stackoverflow.com/questions/13424385/…

标签: oracle tomcat jdbc


【解决方案1】:

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

【讨论】:

  • 我们实际上确实有一个 RAC,这就是我要问的原因,因为如果我们丢失了一个数据库并且它恰好是我所指向的那个,那么我们就会丢失该服务。所以,基本上,你所说的是我需要指向 TNS 以便它默认为一个正在工作的。对吗?
  • 是的,没错。在您的 TNS 中,您可以为您的 RAC 指定不同的节点。在这种情况下,如果您的一个节点出现故障,该服务仍然可用。
【解决方案2】:

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

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

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

TNS(T透明N网络Substrate)名称是tnsnames.ora文件中的条目名称,保存在$ORACLE_HOME/network/admin
此文件包含系统用于连接到 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);

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 2017-01-26
    • 2019-12-07
    • 2019-11-11
    • 2011-03-22
    • 1970-01-01
    • 2015-04-24
    • 2010-10-16
    相关资源
    最近更新 更多