我在我的 MacOS 上做了一个测试
# fire up the database. Hint, use gvenzl images instead. Much faster!
docker run -d -e ORACLE_PWD="root" --name testdb -p 5500:5500 -p 8081:8080 -p 1521:1521 container-registry.oracle.com/database/express:21.3.0-xe
# I have sqlplus installed locally on my MacOS
echo 'select dummy from dual;' | sqlplus -S system/"root"@localhost/XE
D
-
X
echo 'select dummy from dual;' | sqlplus -S system/"root"@localhost:XE
ERROR:
ORA-12545: Connect failed because target host or object does not exist
SP2-0306: Invalid option.
# so, how is JDBC behaving taking the connect string as argument
java -cp .:./ojdbc8-19.6.0.0.jar OracleJDBC "jdbc:oracle:thin:@localhost:1521:XE"
X
java -cp .:./ojdbc8-19.6.0.0.jar OracleJDBC "jdbc:oracle:thin:@localhost:XE"
java.sql.SQLRecoverableException: IO Error: Invalid number format for port number
java -cp .:./ojdbc8-19.6.0.0.jar OracleJDBC "jdbc:oracle:thin:@localhost/XE"
X
笔记。不需要端口,默认为 1521
cat OracleJDBC.java
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class OracleJDBC {
public static void main(String[] argv) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("Where is your Oracle JDBC Driver?");
e.printStackTrace();
return;
}
Connection connection = null;
String query = "select dummy from dual";
try {
connection = DriverManager.getConnection(argv[0], "system","root");
Statement stmt = connection.createStatement();
ResultSet rows = stmt.executeQuery(query);
while (rows.next()) {
System.out.println(rows.getString("dummy"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我无法解释为什么会出现错误。可以是您使用的 JDBC 版本吗?我刚刚证明,您的连接应该有效。也就是说,您不应该再使用 SID 构造 (:SID) 进行连接。您将访问根容器,而不是您应该存储数据的位置 - 在可插拔数据库中。快速版带有默认的可插入数据库“XEPDB1”。
echo 'select name from v$pdbs;' | sqlplus -S system/"root"@localhost/XE
NAME
------------------------------
PDB$SEED
XEPDB1
这应该是您的连接字符串:
echo 'select dummy from dual;' | sqlplus -S system/"root"@localhost/XEPDB1
D
-
X
从这里您可以创建您的应用程序模式和用户,这样您就不会再使用高级用户“系统”。
祝你好运!