首页 文章

在JDBC连接中使用TNS名称和服务名称之间的区别

提问于
浏览
15

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

   )

  )

)

谢谢!

2 回答

  • 6

    Oracle SID是唯一标识您的实例/数据库的唯一名称,其中Service name是您在远程连接到数据库时提供的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配置文件,它定义用于 Build 与它们的连接的数据库地址 .

  • 10

    SERVICE_NAME 是数据库实例(或许多实例)的 alias . 这样做的主要目的是运行集群 . 使用此功能,我们可以连接群集中的特定数据库 . 换句话说,使用 SIDS ystem ID entifier),我们可以连接到数据库实例,这是Oracle数据库实例的 unique 名称 .

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

    有几种方法可以提供数据库信息,如Directly Specified,tnsnames.ora(即TNS名称),LDAP目录,网络信息服务 .

    TNS( T ransparent N etwork S ubstrate)名称是 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);
    

相关问题