如何将JDBC连接到tns oracle

Mar*_*oli 8 java tnsnames jdbc oracle11g

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

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

我尝试了什么:

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

"jdbc:oracle:thin:@//host:port))/tnsfile)";
Run Code Online (Sandbox Code Playgroud)

我的电脑名是myPC

在tnsfile中写入的端口是5151

所以我尝试了这个连接String

"jdbc:oracle:thin:@//myPC:5151))/tnsfile"
Run Code Online (Sandbox Code Playgroud)

但我得到了这个例外

java.sql.SQLRecoverableException: IO ERROR: SO Exception was generated
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

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

Prz*_*lej 17

您必须将名为的属性设置为oracle.net.tns_admin指向包含tnsnames.ora文件的文件夹的位置.然后@在数据库URL中签名后指定该文件中的条目.检查下面的例子.您可以在此处找到更多信息:数据源和URL - Oracle文档

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) {}
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

tnsnames.ora文件中的示例条目:

my_net_service_name= 
 (DESCRIPTION= 
   (ADDRESS=(some address here))
   (CONNECT_DATA= 
     (SID=some_SID_name)))

其中my_net_service_namestring是你有什么subsitite用于ENTRY_FROM_TNSNAMES从我的Java示例.

  • @DineshMailapur有几个选项.您可以在命令行中设置路径并使用不同的脚本来运行您的应用程序 - 检查[此主题](http://stackoverflow.com/questions/7351533/set-multiple-system-properties-java-command-line)了解如何在命令行中设置属性.或者,您可以在每个系统中设置具有相同名称的环境变量(win/unix)并在运行程序时获取其值:检查[此主题](http://stackoverflow.com/questions/18127534/getting-环境变量 - 值从-java的).最后,您可以从一些配置文件中读取路径. (2认同)

小智 6

请尝试以下操作:

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);
Run Code Online (Sandbox Code Playgroud)

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

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

Gre*_*ala 5

而不是硬编码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);
}
Run Code Online (Sandbox Code Playgroud)