【发布时间】:2020-10-21 18:43:16
【问题描述】:
我正在关注guide,以使用 IDE IntelliJ 从 Java 应用程序连接到 Oracle 云数据库。
我认识prerequisites是因为:
- 我在 Oracle 云服务中有一个数据库
- 我下载了钱包,并将文件放在工作区的 src 目录中。
- 我使用的是最新的 JDK 14
- 我正在使用 ojdbc8.jar
- 我还下载了 oraclepki、osdt_cert 和 osdt_core jar,它们都作为 java 库添加到我的测试项目中
推荐的 BD_URL 永远不会起作用。我总是得到:java.net.UnknownHostException 和 oracle.net.ns.NetException:网络适配器无法建立连接
DB_URL= "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=testgerard_high)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=testgerard_high)))"
然后我在Oracle support发现可以添加到钱包目录,但是同样的问题。
DB_URL= "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=testgerard_high)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=testgerard_high))(SECURITY = (MY_WALLET_DIRECTORY = src\\Wallet_testGerard)))"
如果我使用适用于我的设置的 18.3 JDBC 驱动程序切换到连接字符串,则会收到错误:连接字符串格式无效,有效格式为:“host:port:sid”
DB_URL="jdbc:oracle:thin:@testgerard_high?TNS_ADMIN=src\\Wallet_testGerard";
最后,我看到here 一种方法可以将钱包文件夹通知出BD_URL,因此我不会收到无效格式异常:
System.setProperty("oracle.net.tns_admin","src\\Wallet_testGerard");
现在它正在尝试连接,但在 60 秒后失败并出现 exception:sun.security.provider.certpath.SunCertPathBuilderException: cannot find valid certificate path to requested target
我改编了一个 oracle 示例,这是我的代码:
import java.sql.SQLException;
import java.sql.DatabaseMetaData;
import oracle.jdbc.pool.OracleDataSource;
import oracle.jdbc.OracleConnection;
public class OracleDataSourceSample
{
final static String DB_URL="jdbc:oracle:thin:@testgerard_high";
//final static String DB_URL="jdbc:oracle:thin:@testgerard_high?TNS_ADMIN=src\\Wallet_testGerard";
//final static String DB_URL= "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=testgerard_high)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=testgerard_high))(SECURITY = (MY_WALLET_DIRECTORY = src\\Wallet_testGerard)))";
final static String DB_USER = "hr";
final static String DB_PASSWORD = "hr";
public static void main (String args[]) throws SQLException, ClassNotFoundException {
System.setProperty("oracle.net.tns_admin","src\\Wallet_testGerard");
Class.forName("oracle.jdbc.driver.OracleDriver");
OracleDataSource ods = new OracleDataSource();
ods.setURL(DB_URL);
ods.setUser(DB_USER);
ods.setPassword(DB_PASSWORD);
// With AutoCloseable, the connection is closed automatically.
try (OracleConnection connection = (OracleConnection)
ods.getConnection()) {
// Get the JDBC driver name and version
DatabaseMetaData dbmd = connection.getMetaData();
System.out.println("Driver Name: " + dbmd.getDriverName());
System.out.println("Driver Version: " +
dbmd.getDriverVersion());
System.out.println("Database Username is: " +
connection.getUserName());
}
}
}
【问题讨论】:
-
你是在 Windows 还是 Linux 环境下运行 java 代码?
-
我使用的是 Windows。
-
感谢 Sam,我尝试将 tns_admin 目录添加到路径中,但没有任何变化。该应用程序已经在我的代码中找到了由于 System.setProperty 的 forlder,我知道因为如果我更改那里的路径,我会返回“无法解析连接标识符”NetException
-
我的意思是
System.setProperty("oracle.net.tns_admin","src\\Wallet_testGerard");中的路径。我运行你的代码,因为它使用 tns_admin/wallet 路径到 windows 目录,它工作正常 -
我明白了,我切换到绝对路径
System.setProperty("oracle.net.tns_admin","C:\\Users\\gerar\\IdeaProjects\\M03\\UF6\\OracleSimpleExample\\src\\Wallet_testGerard");,但仍然无法找到请求目标的有效认证路径