自定义类加载器----一个应用里同时加载两个版本的OJDBC驱动
时间: 2023-06-24 16:05:43 浏览: 107
oracle各版本的ojdbc驱动
4星 · 用户满意度95%
在一个应用程序中同时加载两个版本的OJDBC驱动是比较困难的,因为Java类加载器默认使用委派模型,即当一个类需要被加载时,它首先会请求其父类加载器加载该类,如果父类加载器无法加载该类,则由当前类加载器尝试加载该类。
为了解决这个问题,我们可以使用自定义类加载器来加载不同版本的OJDBC驱动。自定义类加载器可以绕过默认的委派模型,从而使得我们可以在同一个应用程序中加载不同版本的类。
下面是一个简单的例子,演示如何使用自定义类加载器加载两个版本的OJDBC驱动:
```java
import java.net.URL;
import java.net.URLClassLoader;
public class CustomClassLoader extends URLClassLoader {
public CustomClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.startsWith("oracle.jdbc.")) {
String version = System.getProperty("oracle.jdbc.version");
if (version != null && version.equals("11g")) {
return loadClassFromVersion(name, "11g");
} else {
return loadClassFromVersion(name, "12c");
}
}
return super.loadClass(name);
}
private Class<?> loadClassFromVersion(String name, String version) throws ClassNotFoundException {
String className = name.replace(".", "/") + ".class";
URL url = getResource(className.replace(version, "common"));
if (url == null) {
throw new ClassNotFoundException(name);
}
byte[] bytes = null;
try {
bytes = IOUtils.toByteArray(url.openStream());
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
return defineClass(name, bytes, 0, bytes.length);
}
}
```
在这个自定义类加载器中,我们重写了loadClass方法,并根据系统属性oracle.jdbc.version的值来判断应该加载哪个版本的OJDBC驱动。
如果oracle.jdbc.version的值为11g,则加载11g版本的驱动,否则加载12c版本的驱动。
在loadClass方法中,我们首先判断要加载的类是否以oracle.jdbc.开头,如果是,则调用loadClassFromVersion方法加载对应版本的类。
在loadClassFromVersion方法中,我们首先使用getResource方法获取该类对应的URL,然后读取该URL对应的字节码,并使用defineClass方法将该类加载到内存中。
最后,我们在应用程序中使用自定义类加载器来加载OJDBC驱动:
```java
URL[] urls = new URL[] { new URL("file:///path/to/ojdbc11.jar"), new URL("file:///path/to/ojdbc12.jar") };
ClassLoader parent = ClassLoader.getSystemClassLoader();
CustomClassLoader loader = new CustomClassLoader(urls, parent);
System.setProperty("oracle.jdbc.version", "11g"); // 设置oracle.jdbc.version属性为11g
Class<?> driverClass = loader.loadClass("oracle.jdbc.driver.OracleDriver");
Driver driver = (Driver) driverClass.newInstance();
```
在这个例子中,我们首先创建一个CustomClassLoader对象,并将ojdbc11.jar和ojdbc12.jar的URL作为参数传入。
然后,我们设置oracle.jdbc.version属性为11g,并使用CustomClassLoader加载对应版本的OracleDriver类,并创建该类的实例。
这样,我们就可以在同一个应用程序中同时使用不同版本的OJDBC驱动了。
阅读全文