我正在尝试将Oracle数据库与JDBC驱动程序连接。我收到java.sql.SQLException:无效的Oracle URL指定的错误。请帮助我解决问题。
package test_connection;
import java.sql.*;
public class TestConnection {
public static void main(String[] args) {
// TODO code application logic here
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Driver loaded successfully ");
Connection con = DriverManager.getConnection("jdbc:oracle:thin@:localhost:1521:XE", username, password);
System.out.println("Connection established successfully ");
con.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
[SID和service_names有两个不同的URL
对于SID"jdbc:oracle:thin:@localhost:1521:SID","username", "password"
对于服务名称"jdbc:oracle:thin:@//localhost:1521/SERVICE_NAME","username", "password"
C:\>type TestConnection.java
//Connect db on Docker container
//192.168.99.107
//service name xepdb1
//package test_connection;
import java.sql.*;
public class TestConnection {
public static void main(String[] args) {
// TODO code application logic here
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Driver loaded successfully ");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@//192.168.99.107:1521/XEPDB1","hr", "hr");
System.out.println("Connection established successfully ");
C:\>javac TestConnection.java
C:\>java -cp .;ojdbc8.jar TestConnection
Driver loaded successfully
Connection established successfully
如果使用不同的URL会发生什么
C:\>type TestConnection.java
//Connect db on Docker container
//192.168.99.107
//service name xepdb1
//package test_connection;
import java.sql.*;
public class TestConnection {
public static void main(String[] args) {
// TODO code application logic here
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Driver loaded successfully ");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@192.168.99.107:1521:XEPDB1","hr", "hr");
System.out.println("Connection established successfully ");
con.close();
}
catch(Exception e){
System.out.println(e);
}
}
}
C:\>javac TestConnection.java
C:\>java -cp .;ojdbc8.jar TestConnection
Driver loaded successfully
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
这里是一个问题,我怎么知道我的数据库使用的是SID还是服务名称。您可以查看tnsnames.ora或tnsping
C:\>docker exec -it xedb tnsping xepdb1
TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 26-MAY-2020 19:55:20
Copyright (c) 1997, 2018, Oracle. All rights reserved.
Used parameter files:
/opt/oracle/product/18c/dbhomeXE/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XEPDB1))
从上面可以看到连接使用了service_name。
上次测试与脚本"jdbc:oracle:thin@:192.168.99.107:1521:XEPDB1","hr", "hr"
相同(与第二次测试相同,但在&后面加上冒号)
C:\>java -cp .;ojdbc8.jar TestConnection
Driver loaded successfully
java.sql.SQLException: Invalid Oracle URL specified