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

标签 java oracle scala jdbc tnsnames

我正在尝试使用 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

其他上下文:

  • 我正在尝试创建 Java 的 DataSource ( OracleDataSource 为 严格)在 Scala (它是 Play 框架 - 但我没有使用 Play 的 创建数据库连接的方式 - 我正在手动执行)
  • 我有使用完全相同的 SQL Developer tnsnames.ora文件并且它正在那里工作
  • 我们有使用完全相同的 C# 应用程序 tnsnames.ora文件并且它正在那里工作(数据源定义如下: <add name="connectionName" connectionString="Data Source=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)
    )
  )

关于java - 尝试使用包含点字符的 TNS 别名连接到 Oracle 时出现 "Invalid connection string format"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341480/

相关文章:

scala - 从命令行运行时找不到包

Javamail getContent() fatal error java.lang.NoClassDefFoundError

java - 数据库架构

sql - 根据条件在 Oracle 中动态重复行

sql - Oracle sql 创建查询只返回一个 'employee' 的值

oop - 从具有 Id 的数据库中获取对象时,是否使用 Option 作为结果?

java - Android,使用proguard和序列化

java - Hibernate搜索结果排名

oracle - PL/SQL 中无法选择 count(*)

scala - Deequ中的唯一性检查