【问题标题】:Oracle JDBC connection: no ocijdbc9 in java.library.pathOracle JDBC 连接:java.library.path 中没有 ocijdbc9
【发布时间】:2014-08-07 15:43:21
【问题描述】:

我在尝试连接到 oracle 数据库时遇到以下错误, 当我在网上搜索时,建议是在类路径中添加所需的 jar,我已经这样做了。我什至尝试创建一个运行配置,在类路径中添加了 jar,仍然得到同样的错误。

请帮忙,

错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no ocijdbc9 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at oracle.jdbc.oci8.OCIDBAccess.logon(OCIDBAccess.java:262)
    at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:346)
    at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at com.example.DAO1.main(DAO1.java:13)

代码:

package com.example;

import java.sql.*;
import java.io.*;

class DAO1 {
    public static void main(String args[]) throws SQLException, IOException {
        // Load the driver
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

        // Connect to the database
        // You can put a database name after the @ sign in the connection URL.
        Connection conn = DriverManager.getConnection(
                "jdbc:oracle:oci8:@mydevdb:1521:mysandbox", "uname", "pwd");

        System.out.println(conn);

        // Close the connection
        conn.close();
    }
}

我添加了 ojdbc14.jar

【问题讨论】:

  • 刚刚注意到我将连接字符串更改为'jdbc:oracle:thin'后,错误消失了!虽然不清楚

标签: java oracle jdbc


【解决方案1】:

您需要 100% Java 的 JDBC 瘦驱动程序,而不是 OCI 驱动程序。这需要一个 DLL,JVM 告诉您它不在 LD_LIBRARY_PATH 中。

把网址改成

Connection conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@mydevdb:1521:mysandbox", "uname", "pwd");

我也不喜欢您拥有的驱动程序 JAR。我建议至少获取 ojdbc6.jar。 ojdbc14.jar 是 JDK 1.4 老式 - 已经过时了。

【讨论】:

  • 我改成 jdbc:oracle:thin 并检查了,错误消失了,虽然不知道原因+1,感谢原因。关于 jar 版本,我从这个线程中选择了它 - stackoverflow.com/questions/919921/… 。将更新到 ojdbc6.jar ,我正在使用 jdk1.6 。我可以尽快接受答案
  • 嗨@duffymo - 当你有机会时,你能帮我对我刚刚发布的这个问题提出一些建议吗 - stackoverflow.com/questions/25190219/…
【解决方案2】:

永远不要手动调用DriverManager.registerDriver() 方法。 JDBC 规范要求驱动程序在加载类时自行注册,并且类通过Class.forName() 加载。在JDBC 4 中,驱动程序只需位于类路径上即可自动加载。

【讨论】:

  • 在 docs.oracle.com 的示例中就是这样:docs.oracle.com/cd/A84870_01/doc/java.816/a81354/samapp2.htm
  • 但有时您可能最终会注册您的驱动程序类两次
  • 我同意这不是必需的,但它对于早期的 JDBC 习惯用法是正确的。前面的例子都会这样做。做两次不会破坏交易 - 充其量是纳米优化。
  • ya @duffymo 你是对的,现在在 JDBC 4 中,如果驱动程序位于类路径中,则它们能够自动加载,这是一个很大的进步。
  • 很棒?充其量是轻微的。
猜你喜欢
  • 2010-10-29
  • 2020-04-10
  • 2018-07-20
  • 2012-04-26
  • 1970-01-01
  • 2014-06-15
  • 2019-10-27
  • 2014-09-24
  • 2015-06-16
相关资源
最近更新 更多