java oci 连接oracle抛java.lang.UnsatisfiedLinkError: ocijdbc11...,ocijdbc11
首先成功安装oracle客户端,可用sqlplus工具连接TNSNAMES.ORA配置的本地服务名如:
conn user/pass@dbName
若连接成功;客户端安装成功。
java程序若要采用oci方式连接本地服务,需要进行相应的配置具体可见ORACLE_HOME/jdbc/Readme.txt文件里的说明,其中
部分摘抄如下:
Setting Up Your Environment
---------------------------
On Windows platforms:
- Add [ORACLE_HOME]\jdbc\lib\ojdbc5.jar to
your CLASSPATH if you use JDK 1.5 or
[ORACLE_HOME]\jdbc\lib\ojdbc6.jar if you use JDK 1.6.
- Add [ORACLE_HOME]\jlib\orai18n.jar to your CLASSPATH if needed.
- Add [ORACLE_HOME]\bin to your PATH if you are using the JDBC OCI
driver.
On Solaris/Digital Unix:
- Add [ORACLE_HOME]/jdbc/lib/ojdbc5.jar to your CLASSPATH if you
use JDK 1.5 or [ORACLE_HOME]/jdbc/lib/ojdbc6.jar if you use JDK 1.6
- Add [ORACLE_HOME]/jlib/orai18n.jar to your CLASSPATH if needed.
- Add [ORACLE_HOME]/jdbc/lib to your LD_LIBRARY_PATH if you use
the JDBC OCI driver.
On HP/UX:
- Add [ORACLE_HOME]/jdbc/lib/ojdbc5.jar to your CLASSPATH if you
use JDK 1.5 or [ORACLE_HOME]/jdbc/lib/ojdbc6.jar if you use JDK 1.6
- Add [ORACLE_HOME]/jlib/orai18n.jar to your CLASSPATH if needed.
- Add [ORACLE_HOME]/jdbc/lib to your SHLIB_PATH and LD_LIBRARY_PATH
if you use the JDBC OCI driver.
On AIX:
- Add [ORACLE_HOME]/jdbc/lib/ojdbc5.jar to your CLASSPATH if you
use JDK 1.5 or [ORACLE_HOME]/jdbc/lib/ojdbc6.jar if you use JDK 1.6
- Add [ORACLE_HOME]/jlib/orai18n.jar to your CLASSPATH if needed.
- Add [ORACLE_HOME]/jdbc/lib to your LIBPATH and LD_LIBRARY_PATH
if you use the JDBC OCI driver.
确保程序使用的jdbc OCI DRIVER与oracle 客户端一致,另外NLS_LANG与数据库和客户端字符集配置一致。
经过上面的配置后,若程序仍然出现java.lang.UnsatisfiedLinkError: ocijdbc11...情况,
请检查程序使用JDK版本位数(32位还是63位)是否与oracle客户端版本一致。
OCI 只是一种连接方式,既然你使用 Java 来做客户端程序,为什么要使用 Native 方式的驱动?
你应该使用 java:oracle:thin:@ 的 thin 协议来连接数据库。
OCI 本身是为 C++, VB 这样的程序准备的。Java 版本的程序建议使用 thin 协议的驱动。
Java 驱动有4种类型,type 1 - type 4,现在已经基本上普及了type 4驱动,几乎所有的厂商都提供 type 4驱动,它是说服务器端和驱动程序之间是厂商内部网络通信格式,驱动程序和 java 程序之间是纯 java。而依赖厂商的 DLL 的驱动就是 type 2,它是要求在当前 path 变量路径或 java.library.path 参数的路径上能找到 oracle 驱动程序的 DLL。所以如果你坚持使用 oci 驱动,你需要把 oracle 的 BIN 目录 (可能还有其它目录,反正有Oracle 的 DLL 的目录你都得确认一下)添加到 PATH 变量中。
而且要记得,type 2 驱动跟版本之间的依赖关系比较大,可能它要求特定版本的 DLL,而 type 2 则不同,它本身不依赖 dll,驱动与服务器之间本来就是纯 java 版的,它本身代替了DLL 的功能,所以版本依赖关系小。
你的 -Djava.library.path 的路径是真实存在的 oracle 客户端目录么?里面说的那个 dll 能找到么?你的程序中 println(System.getProperty("java.library.path")) 得到的结果是什么?
原因:oracle客户端中和程序使用的驱动包不是一个版本。
解决办法:把oracle客户端下的ojdbc jar包放到工程的WEB-INF/lib下