我正在遵循JDBC Developer's Guide并尝试使用简短的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驱动程序....但是无法使用这个程序。我的应用程序将使用瘦驱动程序连接到数据库,所以我的挫折程度是....攀爬。
感谢任何帮助。
答案 0 :(得分:3)
也许以下评论可以解释为什么您需要服务名称而不是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
答案 1 :(得分:0)
我可以使用用户名/密码连接到我的容器数据库(包含我的表,包等)。
返回:
JDBC driver version is 12.1.0.2.0
仍然无法连接教程&#34; HR&#34;安装oracle 12c的PDB以及JDBC教程使用的PDB。
编辑:
使用以下方法使其工作:
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());
}
}
仍然不明白为什么我需要完整的全局名称而不是实例名称。
答案 2 :(得分:0)
连接到PDB时,应始终在连接字符串中使用PDB的服务名称。看起来您的PDB服务是&#34; pdborcl.global.XXXXXXXX.com&#34;这就是你需要用来直接连接PDB的东西。
我个人觉得使用长URL格式更容易:
&#34; JDBC:预言:瘦:@(DESCRIPTION =(ADDRESS =(PROTOCOL = TCP)(HOST =本地主机)(PORT = 1522))(CONNECT_DATA =(SERVICE_NAME = pdborcl.global.XXXXXXXX.com) ))&#34;
很明显,您使用的是服务名称而不是SID。
它的美妙之处在于您还可以使用sqlplus轻松测试连接字符串:
sqlplus&#34; hr / hr @(DESCRIPTION =(ADDRESS =(PROTOCOL = tcp)(HOST = localhost)(PORT = 1522))(CONNECT_DATA =(SERVICE_NAME = pdborcl.global.XXXXXXXX.com))) &#34;
如果sqlplus工作,则没有理由说明JDBC Thin驱动程序不会。
最后,您还可以使用权限用户连接根数据库,然后执行&#34; ALTER SESSION SET CONTAINER = pdb&#34;切换到PDB。如果您决定这样做,则必须先修改连接字符串以连接到根容器。它应该有自己的服务名称。