Oracle 允许使用几种不同的语法来指定在哪里可以找到您的数据库服务。我最常看到的(在我专业开发软件的短短几年里)看起来像这样:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myservice)))
我不认为这种语法有任何特定的名称,但如果您使用图形工具修改它,它就是 Oracle 在其 TNS 文件中生成的。但 Oracle 还允许使用以下更紧凑的语法,至少使用 SQL*Plus 和 application diver 之类的工具:
myserver:1521/myservice
这称为Easy Connect,我读到它是由 Oracle 10g 引入的。这使得它大约有 10 年的历史。我不确定这是否可以在 TNS 文件中使用,尽管它很简短,但我认为没有太多必要将它放在 TNS 文件中。在我看来,它的好处在于:您可以直接将它用于您的应用程序,而无需维护 TNS 文件。
然而,从我所做的工作和与我合作过的客户来看,它的使用似乎并不常见。我什至知道它的唯一原因是因为 ESRI 开始推荐使用它在较新版本的 ArcGIS 中建立连接。这让我想知道为什么它不常见,那么使用 Easy Connect 是否有某种我遗漏的缺点?
(如果有人可以添加更多标签,我将不胜感激。我想不出/找不到更多有意义的东西。)
唯一真正的缺点是有许多配置选项可以放入 TNS 别名中,但在使用简单连接语法时无法使用这些选项。Easy connect 旨在简化简单连接的语法。但是,为了做到这一点,它失去了创建更复杂的 TNS 别名的能力,这些别名可以执行负载平衡/故障转移或请求专用服务器会话等操作。如果您不需要这些,使用更简单的语法没有任何缺点。但是,一旦一个组织有一个使用 easy connect 语法不支持的东西的用例,它要么必须支持一种混合配置,其中一些东西使用 easy connect 而其他东西使用 TNS 别名,或者它必须使用 TNS 别名到处。
根据您的观点,支持混合配置或更改连接处理方式可能会有些痛苦。Oracle 客户端处理一堆不同的命名约定相对容易。一个组织要支持它要困难得多。
对于组织而言,想出将单个共享的 tnsnames.ora 文件分发给每个人或建立中央 LDAP 服务器来托管组织的 TNS 信息的方法相对容易。如果某些应用程序使用简单连接语法而某些组织使用 TNS 别名,那么当组织想要执行诸如合并数据库或将数据库从一台主机移动到另一台主机等操作时,这可能会出现问题。如果一个组织想要添加负载平衡支持,当一些应用程序自动故障转移而另一些则不能时,可能会出现问题。有人必须跟踪哪些应用程序是哪些,管理员必须以不同的方式对待应用程序,而不是能够依赖全面遵守的组织惯例。当然,这一切都不是不可能的。
@Justin-Cave 所说的几乎涵盖了它。使用 tnsnames 或其他解析方法的最佳理由之一是提供一定程度的抽象。基本上,它会阻止应用程序使用难以维护/更改/查找的硬编码值。如果连接保存在 tnsnames 文件中,则可以移动、重命名数据库等,并且不需要更改应用程序,只需重新指向 tnsnames 条目即可。