【问题标题】:How to connect JDBC to tns oracle如何将 JDBC 连接到 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 连接到数据库?

【问题讨论】:

    标签: java jdbc oracle11g tnsnames


    【解决方案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 文件。
      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 2021-05-16
      • 1970-01-01
      • 2017-05-16
      • 2012-12-21
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多