【问题标题】:How to connect to Oracle Cloud DDBB using JDBC Thin Driver and Oracle Wallet如何使用 JDBC Thin Driver 和 Oracle Wallet 连接到 Oracle Cloud DDBB
【发布时间】: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");,但仍然无法找到请求目标的有效认证路径

标签: java oracle jdbc


【解决方案1】:

使用独立的 jdk 8 和 jdk 14 以及 Intellij 社区版进行测试(首次运行防火墙阻止了 intellij)。

    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    import oracle.jdbc.pool.OracleDataSource;
    import oracle.jdbc.OracleConnection;
    import java.sql.DatabaseMetaData;
    
    
    public class SalesConnection
    {
        final static String DB_URL="jdbc:oracle:thin:@oci_adw_high";
        final static String DB_USER = "xxxx";
        final static String DB_PASSWORD = "xxxxx";
    
        public static void main (String args[]) throws SQLException, ClassNotFoundException {
    
    
             System.setProperty("oracle.net.tns_admin","C:\\app\\oracle\\product\\19\\dbhome_1\\network\\admin");
             System.setProperty("oracle.jdbc.fanEnabled","false");
    
            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());
                printSales(connection);
            }
        }
    
        public static void printSales(Connection connection) throws SQLException {
            // Statement and ResultSet are AutoCloseable and closed automatically.
            try (Statement statement = connection.createStatement()) {
              try (ResultSet resultSet = statement
                  .executeQuery("select /* Java Console */PROD_ID, CUST_ID from sales fetch first 10 rows only ")) {
                System.out.println("PROD_ID" + "  " + "CUST_ID");
                System.out.println("---------------------");
                while (resultSet.next())
                  System.out.println(resultSet.getString(1) + " "
                      + resultSet.getString(2) + " ");
              }
            }
          }
}

尝试运行此代码更改表和列名

code的来源

编辑: 从命令提示符编译和执行

javac -cp "C:\ojdbc8-full\*;" SalesConnection.java

java -cp "C:\ojdbc8-full\*;" SalesConnection

【讨论】:

  • 我在禁用防火墙的情况下运行您的代码,但仍然无法实例化连接,同样的错误无法找到请求目标的有效证书路径。我重新安装了 IntelliJ 并尝试使用 jdk 8,11 和 14。它应该在我的项目配置中。您是如何将请求的 .jar 文件作为库包含在项目结构中的?谢谢
  • 这里link 说了一些关于应该在 %JAVA_HOME%/jre/lib/security/cacerts 中的 cacerts,我有文件,但不知道如何下载证书并将它在那里,反正我不认为它是真正需要的。
  • 至少您缩小到 intellij 设置。转到项目根文件夹右键单击打开模块设置或F4,在左侧窗格中选择库并添加所有 jar 文件的目录路径,例如在我的情况下ojdbc8-full目录
  • 感谢@Sam,终于我设法实例化了连接。问题是我只是单独添加了prerequisites 中提到的.jar 文件。当使用 ojdbc8-full 时,它就像一个魅力。
【解决方案2】:

ojdbc8-full.zip 包含连接Oracle 自治数据库所需的oraclepki.jar、osdt_core.jar 和osdt_cert.jar。但是,您可以使用这些 maven 坐标获取 JDBC 驱动程序以及其他附加库。

<dependencies>
  <dependency>
    <groupid>com.oracle.database.jdbc</groupid>
    <artifactid>ojdbc8-production</artifactid>
    <version>19.7.0.0</version>
    <type>pom</type>
  </dependency>
</dependencies>

更多信息请参考Maven Central Guide

【讨论】:

    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2017-01-03
    • 2023-03-06
    • 2021-05-16
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多