"Invalid connection string format" 尝试使用包含点字符的 TNS 别名连接到 Oracle 时出错

"Invalid connection string format" error when trying to connect to Oracle using TNS alias that contains dot character

我正在尝试使用 TNS 连接到 Oracle 数据库。

问题是 TNS 别名包含点,所以当我像这样指定 url 时:

jdbc:oracle:thin:@TNS.ALIAS

我有...

oracle.net.ns.NetException: Invalid connection string format, a valid format is: "host:port:sid"

...正在创建连接。

我知道点字符是个问题,因为从 tnsnames.ora 文件中删除它后,数据库连接正常。

我的问题是 - 是否有可能以某种方式转义点字符?也许可以设置一些连接参数以允许别名中的点字符?我想避免从 tnsnames.ora 中删除点,因为我是从外部源获取文件的。

以下是我已经尝试过但出现相同错误的选项:

jdbc:oracle:thin:@"TNS.ALIAS"
jdbc:oracle:thin:@\"TNS.ALIAS\"
jdbc:oracle:thin:@`TNS.ALIAS`
jdbc:oracle:thin:@TNS\.ALIAS - this one is not compiling
jdbc:oracle:thin:@TNS\.ALIAS
jdbc:oracle:thin:@TNS.ALIAS
jdbc:oracle:thin:@TNS\".\"ALIAS
jdbc:oracle:thin:@TNS%2eALIAS

以下是 oracle.net.ns.NetException: could not resolve the connect identifier 产生的选项:

jdbc:oracle:thin:@TNSALIAS
jdbc:oracle:thin:@TNS-ALIAS
jdbc:oracle:thin:@TNS_ALIAS

其他上下文:

你需要设置

System.setProperty("oracle.net.tns_admin","C:\app\product\12.2.0\client_1\network\admin"); 

设置为tnsnames.ora

的位置
import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnect {
    public Connection connection;

    public DBConnect() {
    }

    public void connect() throws Exception {
        String connectString;
        System.setProperty("oracle.net.tns_admin", "C:\app\product\12.2.0\client_1\network\admin");
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connectString = "jdbc:oracle:thin:@esmdj.test";
        System.out.println("Before DriverManager.getConnection");
        try {
            connection = DriverManager.getConnection(connectString, "scott", "tiger");
            System.out.println("Connection established");

            connection.setAutoCommit(false);
        } catch (Exception e) {
            System.out.println("Exception inside connect(): " + e);
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        DBConnect client = new DBConnect();

        System.out.println("beginning");
        try {
            client.connect();
            System.out.println("after Connected");

            client.connection.close();

            System.out.println("after close");

        } catch (Exception e) {
            try {
                System.out.println("Exception : " + e);
                client.connection.close();
                e.printStackTrace();
            } catch (Exception ex) {
                System.out.println("Close Connection Exception : " + ex);
                ex.printStackTrace();
            }
        }

    }

}


C:\Program Files\Java\jdk1.8.0_73\bin>java -classpath  .  DBConnect
beginning
Before DriverManager.getConnection
Connection established
after Connected
after close

tnsnames.ora

esmdj.test =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.yyy.zzz)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ESMD)
    )
  )

我发现了问题 - 在更改为较新的驱动程序(ojdbc8.jar 版本 12.2.0.1 后,我使用的是较旧的 Oracle 驱动程序(ojdbc7.jar 版本 12.1.0.1) ) 通过 TNS 别名查找开始工作 - 无需转义任何内容