Oracle JDBC 连接:java.library.path 中没有 ocijdbc9
Posted
技术标签:
【中文标题】Oracle JDBC 连接:java.library.path 中没有 ocijdbc9【英文标题】:Oracle JDBC connection: no ocijdbc9 in java.library.path 【发布时间】: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'后,错误消失了!虽然不清楚 【参考方案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 版本,我从这个线程中选择了它 - ***.com/questions/919921/… 。将更新到 ojdbc6.jar ,我正在使用 jdk1.6 。我可以尽快接受答案 嗨@duffymo - 当你有机会时,你能帮我对我刚刚发布的这个问题提出一些建议吗 - ***.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 中,如果驱动程序位于类路径中,则它们能够自动加载,这是一个很大的进步。 很棒?充其量是轻微的。以上是关于Oracle JDBC 连接:java.library.path 中没有 ocijdbc9的主要内容,如果未能解决你的问题,请参考以下文章