Java JDBC - How to connect to Oracle using tnsnames.ora

后端 未结 5 2061
再見小時候
再見小時候 2020-11-29 08:41

tnsnames.ora file contains the Databases and the their description (host + port).

  • Is it possible to esta

5条回答
  •  有刺的猬
    2020-11-29 08:57

    Well, in some GUIs the TNS driver configuration is simply not implemented or not working (NetBeans for example :-) )

    https://netbeans.org/bugzilla/show_bug.cgi?id=231526

    There is simple workaround here. You can take the entry directly from the tnsnames.ora file and attach it to the jdbc driver string as following:

    Example from using odbc7.jar (Oracle 12c JDBC driver for JDK 7) to connect to Oracle 11gR2 RAC cluster:

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=hostA)(PORT= 1522))(ADDRESS=(PROTOCOL=TCP)(HOST=hostB)(PORT=1521)))(SOURCE_ROUTE=yes)(CONNECT_DATA=(SERVICE_NAME=DatabaseService)))

    Be aware of putting double :: characters in the end as host:port:service, if you will put :: in the end like this:

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=hostA)(PORT= 1522))(ADDRESS=(PROTOCOL=TCP)(HOST=hostB)(PORT=1521)))(SOURCE_ROUTE=yes)(CONNECT_DATA=(SERVICE_NAME=DatabaseService)))::

    You will end up with "NL Exception was generated" exception.

    Another approach is to configure following property: System.setProperty("oracle.net.tns_admin","C:/app/product/11.2.0/client_1/NETWORK/ADMIN");

    Of course, instead of hardcoded value, you can for example set up environment variable in your operating system like ORACLE_TNS_ADMIN and then reference it:

    System.setProperty("oracle.net.tns_admin",System.getenv("ORACLE_TNS_ADMIN"));
    

    or pass it to java process via -D switch on linux:

    -Doracle.net.tns_admin=$ORACLE_TNS_ADMIN
    

    and windows:as

    -Doracle.net.tns_admin=%ORACLE_TNS_ADMIN%
    

    Once our application is aware of TNS config file, we can connect by reference service name in TNSNAMES.ora file as in this full example:

     // tell the driver where to look for the TNSNAMES.ORA file
    System.setProperty(
              "oracle.net.tns_admin",
              "C:/app/product/11.2.0/client_1/NETWORK/ADMIN");
    
    // ORCL is net service name from the TNSNAMES.ORA file
    String dbURL = "jdbc:oracle:thin:@ORCL";
    
    // load the driver
    Class.forName("oracle.jdbc.OracleDriver");
    
    Connection conn = null;
    Statement stmt = null;
    
    try {
      conn = DriverManager.getConnection(dbURL,
                                         "your_username",
                                         "your_password");
    
      stmt = conn.createStatement();
    
      ResultSet rs = stmt.executeQuery("SELECT dummy FROM dual");
    

提交回复
热议问题