使用瘦驱动程序的 Oracle 12c 数据库连接抛出 IO 错误
Oracle 12c database connection using thin driver throws IO error
我正在按照 JDBC 开发人员指南并尝试使用简短的 java 程序测试 JDBC 瘦驱动程序连接。
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class JDBCVersion
{
public static void main (String args[]) throws SQLException
{
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:hr/hr@localhost:1522:orcl");
Connection conn = ods.getConnection();
// Create Oracle DatabaseMetaData object
DatabaseMetaData meta = conn.getMetaData();
// gets driver info:
System.out.println("JDBC driver version is " + meta.getDriverVersion());
}
} //<host>:<port>:<service>
我已经尝试了所有可能的 <host>:<port>:<service>
组合,但仍然得到 java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection
我已经使用教程中包含的另一个程序成功地测试了 OCI 驱动程序....但无法使该程序运行。我的应用程序将使用瘦驱动程序连接到数据库,所以我的沮丧程度是......攀升。
感谢任何帮助。
我可以使用 username/password.
连接到我的容器数据库(包含我的表、包等)
Returns:
JDBC driver version is 12.1.0.2.0
仍然无法连接到 oracle 12c 安装附带的教程 "HR" PDB,JDBC 教程使用了它。
编辑:
使用以下方法让它工作:
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class JDBCVersion
{
public static void main (String args[]) throws SQLException
{
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:1522/pdborcl.global.XXXXXXXX.com");
ods.setUser("hr");
ods.setPassword("hr");
Connection conn = ods.getConnection();
// Create Oracle DatabaseMetaData object
DatabaseMetaData meta = conn.getMetaData();
// gets driver info:
System.out.println("JDBC driver version is " + meta.getDriverVersion());
}
}
仍然不明白为什么我需要完整的全局名称而不是实例名称。
也许以下评论可以解释为什么您需要服务名称而不是 URL 中的 SID。
Oracle JDBC FAQ提到SIDs will be cease to be supported in one of the next few releases of the database
Oracle JDBC devolopers guide提及Always connect to a service. Never use instance_name or SID because these do not direct to known good instances and SID is deprecated
Oracle 2 day + Java developer tutorial 提到语法 jdbc:oracle:driver_type:[username/password]@//host_name:port_number:SID
似乎是 SID 和服务名称 URL 的混合体(遵循其他文档和您的工作示例)
相比之下,OracleDriver 的 javadoc 仅提及 SID 语法
Oracle FAQ wiki 提及两种语法
.
jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID
jdbc:oracle:thin:[USER/PASSWORD]@//[HOST][:PORT]/SERVICE
连接到 PDB 时,您应该始终在连接字符串中使用 PDB 的服务名称。看起来您的 PDB 服务是 "pdborcl.global.XXXXXXXX.com",因此您需要使用它来直接连接 PDB。
我个人觉得使用长 URL 格式更容易:
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=pdborcl.global.XXXXXXXX.com)))"
很明显您使用的是服务名称而不是 SID。
它的美妙之处在于您还可以使用 sqlplus 轻松测试您的连接字符串:
sqlplus "hr/hr@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=pdborcl.global.XXXXXXXX.com)))"
如果 sqlplus 可以工作,那么 JDBC 瘦驱动程序没有理由不工作。
最后也可以使用特权用户连接根数据库,然后执行"ALTER SESSION SET CONTAINER=pdb"切换到PDB。如果您决定这样做,则必须先修改连接字符串以连接到根容器。它应该有自己的服务名称。
我正在按照 JDBC 开发人员指南并尝试使用简短的 java 程序测试 JDBC 瘦驱动程序连接。
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class JDBCVersion
{
public static void main (String args[]) throws SQLException
{
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:hr/hr@localhost:1522:orcl");
Connection conn = ods.getConnection();
// Create Oracle DatabaseMetaData object
DatabaseMetaData meta = conn.getMetaData();
// gets driver info:
System.out.println("JDBC driver version is " + meta.getDriverVersion());
}
} //<host>:<port>:<service>
我已经尝试了所有可能的 <host>:<port>:<service>
组合,但仍然得到 java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection
我已经使用教程中包含的另一个程序成功地测试了 OCI 驱动程序....但无法使该程序运行。我的应用程序将使用瘦驱动程序连接到数据库,所以我的沮丧程度是......攀升。
感谢任何帮助。
我可以使用 username/password.
连接到我的容器数据库(包含我的表、包等)Returns:
JDBC driver version is 12.1.0.2.0
仍然无法连接到 oracle 12c 安装附带的教程 "HR" PDB,JDBC 教程使用了它。
编辑:
使用以下方法让它工作:
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class JDBCVersion
{
public static void main (String args[]) throws SQLException
{
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:1522/pdborcl.global.XXXXXXXX.com");
ods.setUser("hr");
ods.setPassword("hr");
Connection conn = ods.getConnection();
// Create Oracle DatabaseMetaData object
DatabaseMetaData meta = conn.getMetaData();
// gets driver info:
System.out.println("JDBC driver version is " + meta.getDriverVersion());
}
}
仍然不明白为什么我需要完整的全局名称而不是实例名称。
也许以下评论可以解释为什么您需要服务名称而不是 URL 中的 SID。
Oracle JDBC FAQ提到
SIDs will be cease to be supported in one of the next few releases of the database
Oracle JDBC devolopers guide提及
Always connect to a service. Never use instance_name or SID because these do not direct to known good instances and SID is deprecated
Oracle 2 day + Java developer tutorial 提到语法
jdbc:oracle:driver_type:[username/password]@//host_name:port_number:SID
似乎是 SID 和服务名称 URL 的混合体(遵循其他文档和您的工作示例)相比之下,OracleDriver 的 javadoc 仅提及 SID 语法
Oracle FAQ wiki 提及两种语法
.
jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID
jdbc:oracle:thin:[USER/PASSWORD]@//[HOST][:PORT]/SERVICE
连接到 PDB 时,您应该始终在连接字符串中使用 PDB 的服务名称。看起来您的 PDB 服务是 "pdborcl.global.XXXXXXXX.com",因此您需要使用它来直接连接 PDB。
我个人觉得使用长 URL 格式更容易:
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=pdborcl.global.XXXXXXXX.com)))"
很明显您使用的是服务名称而不是 SID。
它的美妙之处在于您还可以使用 sqlplus 轻松测试您的连接字符串:
sqlplus "hr/hr@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=pdborcl.global.XXXXXXXX.com)))"
如果 sqlplus 可以工作,那么 JDBC 瘦驱动程序没有理由不工作。
最后也可以使用特权用户连接根数据库,然后执行"ALTER SESSION SET CONTAINER=pdb"切换到PDB。如果您决定这样做,则必须先修改连接字符串以连接到根容器。它应该有自己的服务名称。