如何将 JDBC 连接到 tns oracle

Posted

技术标签:

【中文标题】如何将 JDBC 连接到 tns oracle【英文标题】:How to connect JDBC to tns oracle 【发布时间】:2013-11-01 09:40:34 【问题描述】:

我可以使用 tns 文件从 plsql 连接到数据库

现在我想使用 JDBC 从我的 Java 连接到数据库。

我尝试了什么:

我搜索谷歌,我发现我必须使用这个连接字符串:

"jdbc:oracle:thin:@//host:port))/tnsfile)";

我的计算机名称是 myPC

tnsfile中写入的端口是5151

所以我尝试了这个连接字符串

"jdbc:oracle:thin:@//myPC:5151))/tnsfile"

但我得到了这个异常

java.sql.SQLRecoverableException: IO ERROR: SO Exception was generated

我做错了什么?

如何使用 tns 文件将我的 JDBC 连接到数据库?

【问题讨论】:

【参考方案1】:

您必须设置一个名为 oracle.net.tns_admin 的属性以指向包含您的 tnsnames.ora 文件的文件夹的位置。然后在 @ 登录 DB URL 之后指定该文件中的条目。检查下面的示例。你可以在这里找到更多信息:Data sources and URLs - Oracle Documentation

import java.sql.*;

public class Main 
  public static void main(String[] args) throws Exception 
    System.setProperty("oracle.net.tns_admin", "C:/app/product/11.2.0/client_1/NETWORK/ADMIN");
    String dbURL = "jdbc:oracle:thin:@ENTRY_FROM_TNSNAMES";

    Class.forName ("oracle.jdbc.OracleDriver");

    Connection conn = null;
    Statement stmt = null;

    try 
      conn = DriverManager.getConnection(dbURL, "your_user_name", "your_password");

      System.out.println("Connection established");

      stmt = conn.createStatement();

      ResultSet rs = stmt.executeQuery("SELECT dummy FROM dual");

      if (rs.next()) 
        System.out.println(rs.getString(1));
      
     catch (Exception e) 
      e.printStackTrace();
    
    finally 
      if (stmt != null) try  stmt.close();  catch (Exception e) 
      if (conn != null) try  conn.close();  catch (Exception e) 
    
  

来自tnsnames.ora 文件的示例条目:

my_net_service_name=
 (描述=
   (地址=(这里的一些地址))
   (连接数据=
     (SID=some_SID_name)))

my_net_service_name 字符串是您必须在我的 Java 示例中替换 ENTRY_FROM_TNSNAMES 的字符串。

【讨论】:

首先,我使用的是eclipse,其次,@ENTRY_FROM_TNSNAMES 是什么?它是我的 tnsfile 的名称吗? 您使用的 IDE 无关紧要。请阅读此处的 tnsnames.ora:About tnsnames.ora file 基本上,如果您(如您所述)想使用 tnsnames.ora 文件进行连接,则必须将 ENTRY_FROM_TNSNAMES 替换为来自 @987654335 的 net service names 之一@ 文件。查看我编辑的答案以获取示例。 一个小评论。 tnsnames.ora 也支持 include 指令。这不是由 JDBC 驱动程序实现的。几年前报告了一个错误报告。 @Przemyslaw Kruglej - 优秀的解决方案。它对我来说工作正常。我在这里有一个问题,因为我在本地计算机上工作,该计算机在 WindowsXP 上运行,并且我们的代码部署在服务器(UNIX 机器)中。我可以硬编码“tns_admin”路径,如果我在 UNIX 框中部署应用程序,则会失败/抛出异常。我们是否有任何其他替代方案,而不是在上述解决方案中硬编码 tns_admin 路径?请帮助我 @DineshMailapur 有几个选项。您可以在命令行中设置路径并使用不同的脚本来运行您的应用程序 - 检查this thread 以了解如何在命令行中设置属性。或者,您可以在每个系统(win/unix)中设置具有相同名称的环境变量并在运行程序时获取其值:检查this thread。最后,您可以从某个配置文件中读取路径。【参考方案2】:

与其硬编码 tnsnames.ora 的路径,不如从环境中找到它:

public static void setTnsAdmin() 
    String tnsAdmin = System.getenv("TNS_ADMIN");
    if (tnsAdmin == null) 
        String oracleHome = System.getenv("ORACLE_HOME");
        if (oracleHome == null) 
            return; //failed to find any useful env variables
        
        tnsAdmin = oracleHome + File.separatorChar + "network" + File.separatorChar + "admin";
    
    System.setProperty("oracle.net.tns_admin", tnsAdmin);

【讨论】:

【参考方案3】:

尝试以下方法:

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);

确保拥有最新版本的 ojdbc.jar

【讨论】:

由于您的 JDBC 连接字符串中有完整的连接描述,因此您不必向 oracle.net.tns_admin 注册系统属性。实际上,您正在直接连接省略 tnsnames.ora 文件。

以上是关于如何将 JDBC 连接到 tns oracle的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jdbc 连接到 oracle

如何使用 JRuby 和 JDBC 连接到 Oracle

如何使用 JDBC 连接到 Oracle 数据库 [重复]

从 mulestudio 连接到 oracle-tns

如何使用带有 TNSNames 别名语法的 JDBC 瘦驱动程序连接到 Oracle 数据库

如何在没有 TNS 的情况下构建到 Oracle 的 .NET 连接字符串?