从 8u144 更新 Java 后无法使用 ojdbc8 连接到 Oracle DB - 8u171 之后的任何更新(包括 8u171)

Unable to connect to Oracle DB using ojdbc8 after updating Java from 8u144 - any update after and including 8u171

我一直在尝试升级使用 ojdbc8 连接到 Oracle 12.2 数据库的应用程序中使用的 Java 版本(当前为 8u144)。我最近更新到 8u201 的尝试失败并出现以下错误:

Exception in thread "main" java.lang.NullPointerException
at oracle.net.jndi.JndiAttrs.getAttrs(JndiAttrs.java:215)
at oracle.net.resolver.AddrResolution.<init>(AddrResolution.java:237)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:233)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1438)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:518)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:384)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:273)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:198)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:176)
at Main.main(Main.java:22)

我使用的 LDAP url 支持和记录的语法类似于以下内容:

"jdbc:oracle:thin:@ldaps://ldap.example.com:7777/sales,cn=OracleContext,dc=com"

尽管我的问题与以下问题类似,但我没有使用 Hibernate,而且这个问题似乎并没有真正 answer/address 潜在的问题是什么。

为了简化一切,我将我的测试简化为一个仅使用 ojdbc8 和类似以下内容的简单项目:

    String url = "jdbc:oracle:thin:@ldaps://....";
    OracleDataSource ods = new OracleDataSource();
    ods.setUser("indiana");
    ods.setPassword("thedoctor");
    ods.setURL(url);

    Connection conn = ods.getConnection();
    PreparedStatement st = conn.prepareStatement("select * from world where temple = 'doom'");

    ResultSet rs = st.executeQuery();
    while(rs.next()) {
        System.out.println(rs.getString("last"));
    }

如果我使用完全相同的代码和配置将 Java 切换到 8u144,则上述工作正常。我很茫然...

UPDATE 我已经缩小了问题的范围,发现中断发生在 Java 8u171。我正在查看该版本的发行说明以及我现在能找到的任何其他内容。

看起来 SSL 握手在创建 LDAPS 连接时失败了。 运行 带有 java 网络调试选项的测试程序将有助于分析问题。 添加此选项 -Djavax.net.debug=all for 运行 您的测试程序和调试输出将包含 SSL 调试日志,这将有助于确定原因。 JDK 8u171 有一些与安全相关的变化。

(SSL 调试:: https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html)