日期:2014-05-16  浏览次数:20353 次

JDBC OCI的调用过程

原文:http://hzcaixiao.iteye.com/blog/472119

?

前些天在配置通过OCI的方式连接Oracle中曾进碰到一个关于“java.lang.UnsatisfiedLinkError: no XXX in java.library.path”这么一个问题,这个问题纠结了许久才解决,解决方式参考前面的文章。

趁双休日好好的理解一下产生这个问题的来龙去脉。

先看一段话先:

PATH is the environment variable.

java.library.path is the system properties.

When the java application started, JVM will set java.library.path’s value using PATH’s value.

In java program, it's very difficult to get the value of environment variables, but it's very easy to get/set system properties. Use

System.getProperty("project_root", "..");

System.setProperty("project_root", "..");

?

java.libaray.path 是system properties,在windows系统通常是使用PATH的值,而在Linux上是用LD_LIBRARY_PATH的值。 随便也说一下java.class.path,他是对应于CLASSPATH中的值。

?

那LD_LIBRARY_PATH的值主要是干什么呢?他是来处理非标准路径下的”共享库“的,可以理解成windows 的dll,但在linux下是*.so的文件。

?

说完了基本的概念,再来看看OCI是怎么连接Oracle的,其实OCI是通过JNI(java native interface)的方式来访问Oracle的,请看下图

?

1)我们知道Oracle的驱动是classes12.jar(ojdbc14.jar),这里应该对应着java-class;

2)同样我们在JBOSS启动脚本中设置? JBOSS_NATIVE_DIR="/opt/instantclient_10_2",其实就是将LD_LIBRARY_PATH="/opt /instantclient_10_2",而在这个目录下有大量的*.so文件,这些应该对应native;

3)至于jni-stub是一些存根文件,可以参考一下JNI相关的说明,这里就暂不描述了(有时间可以再深入学习)。

?