"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
其他上下文:
- 我正在尝试创建 Java 的
DataSource
(OracleDataSource
严格)在 Scala 中(它是 Play Framework - 但我没有使用 Play 的
创建数据库连接的方式 - 我手动进行)
- 我有 SQL 开发人员正在使用完全相同的
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)
)
)
我发现了问题 - 在更改为较新的驱动程序(ojdbc8.jar
版本 12.2.0.1
后,我使用的是较旧的 Oracle 驱动程序(ojdbc7.jar
版本 12.1.0.1
) ) 通过 TNS 别名查找开始工作 - 无需转义任何内容
我正在尝试使用 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 Framework - 但我没有使用 Play 的 创建数据库连接的方式 - 我手动进行) - 我有 SQL 开发人员正在使用完全相同的
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)
)
)
我发现了问题 - 在更改为较新的驱动程序(ojdbc8.jar
版本 12.2.0.1
后,我使用的是较旧的 Oracle 驱动程序(ojdbc7.jar
版本 12.1.0.1
) ) 通过 TNS 别名查找开始工作 - 无需转义任何内容