`

自定义类加载器----一个应用里同时加载两个版本的OJDBC驱动

阅读更多

对表里字段类型为:DATE

不同版本的OJDBC驱动包使用getObject出来的类型不同。

ojdbc14_10_2_0_4.jar出来的是java.sql.Date

ojdbc14.jar出来的是java.sql.Timestamp

 

但是有的时候,同一个应用里面要访问不同版本的ORACLE数据库,这时就需要同一个应用里面加载两个版本的OJDBC。

A1

public class A1 {
	public static void test1() throws Exception {
		URL[] urls=new URL[2];
		urls[0]=new File("E:\\workspace-nfjd\\testrealpath\\work\\ojdbc14.jar").toURL();
		urls[1]=new File("E:\\workspace-nfjd\\testrealpath\\build\\").toURL();
		URLClassLoader cl1=new URLClassLoader(urls, null);
		cl1.loadClass("oracle.jdbc.OracleDriver").newInstance();
		Object obj1=cl1.loadClass("JdbcTest").newInstance();
		Method m1 = obj1.getClass().getMethod("executeJdbc", new Class[]{});
		m1.invoke(obj1,new Object[]{}); 
	}
	public static void test2() throws Exception {
		URL[] urls=new URL[2];
		urls[0]=new File("E:\\workspace-nfjd\\testrealpath\\build\\ojdbc14_10_2_0_4.jar").toURL();
		urls[1]=new File("E:\\workspace-nfjd\\testrealpath\\build\\").toURL();
		URLClassLoader cl1=new URLClassLoader(urls, null);
		cl1.loadClass("oracle.jdbc.OracleDriver").newInstance();
		Object obj1=cl1.loadClass("JdbcTest").newInstance();
		Method m1 = obj1.getClass().getMethod("executeJdbc", new Class[]{});
		m1.invoke(obj1,new Object[]{}); 
	}
	public static void main(String[] args) throws Exception {
		test1();
		test2();
	}
}

 JdbcTest

public class JdbcTest {
	static{
	}
	public void executeJdbc() {
		try {
			System.out.println(JdbcTest.class.getClassLoader());
			Connection conn = null;
			PreparedStatement ptmt = null;
			ResultSet rs = null;
			conn = DriverManager.getConnection("jdbc:oracle:thin:@10.1.252.80:1521:newngboss", "so1", "so1");
			ptmt = conn
			.prepareStatement("select ROWID,t.* from BAT_PRE_AUTHOR_TMP t where mod(BAT_PRE_AUTHOR_TMP_ID,2)=1 and check_state=1 and rownum <=100 ");
			ptmt.setFetchSize(100);
			rs = ptmt.executeQuery();
			A1 a = null;
			while (rs.next()) {
				System.out.println(rs.getObject("VALID_DATE").getClass());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

注:

 

 一、java.sql.Connection、java.sql.DriverManager加载了几份?

System.out.println(Connection.class.getClassLoader()+":"+ conn+"==="+conn.getClass().getClassLoader());
结果为:
null:oracle.jdbc.driver.OracleConnection@12a0f6c===java.net.URLClassLoader@4f1d0d
null:oracle.jdbc.driver.T4CConnection@ce2187===java.net.URLClassLoader@1f78ef1
所以:
Connection的加载器还是JRE的加载器
Connection的实例加载器是自己的加载器

 所以只加载了一份,其还是由JRE的加载器加载。

 

二、java.sql.DriverManager里面的getCallerClass(callerCL, di.driverClassName ) != di.driverClass作用是?

因为DriverManager只有一个实例,在加载JDBC驱动时,都会执行DriverManager.registerDriver(m_defaultDriver);即会将所有类加载器加载的驱动放入DriverManager.readDrivers里面。

为了保证各个类加载器里面的JDBC实例互不影响,所以在getConnection、getDrivers、getDriver时,通过if (getCallerClass(callerCL, di.driverClassName ) != di.driverClass )过滤了不是自己类加载器加载的驱动。

 

三、 

urls[0]=new URL("file:///E:/workspace-nfjd/testrealpath/work/ojdbc14.jar");

urls[0]=new File("E:\\workspace-nfjd\\testrealpath\\work\\ojdbc14.jar").toURL();

以上两个是等价的。即URL必须协议开头。

最好用:

urls[0]=new File("E:\\workspace-nfjd\\testrealpath\\build\\ojdbc14_10_2_0_4.jar").toURI().toURL();

因为第二种过时了。

分享到:
评论

相关推荐

    oracle各版本的ojdbc驱动

    从oracle官网收集的各版本的jdbc驱动包:ojdbc12_9.0.1.4--ojdbc14_9.2.0.8;ojdbc14_10.1.0.5--ojdbc14_10.2.0.5;ojdbc6_11.2.0.1--ojdbc6_11.2.0.4;ojdbc6_12.1.0.1--ojdbc8_12.2.0.1

    ojdbc-ojdbc6-oracle-驱动包

    在本压缩包中,包含了两个关键文件:“ojdbc6-ojdbc6”可能是驱动的详细说明或者配置指南,而“oracle-jdbc.jar”则是实际的JDBC驱动程序库。 首先,让我们详细了解一下JDBC(Java Database Connectivity)驱动。...

    Oracle Ojdbc各版本驱动包

    Oracle各版本驱动包,有需要的可以下载使用,支持目前常用的不同版本oracle和JDK,根据自己需要调整和使用 主要包括的jar有: ojdbc5.jar 适用JDK版本:JDK 1.5 对应Oracle数据库版本:Oracle数据库版本(如Oracle ...

    ojdbc6-11.2.0.4驱动包

    oracle-11g-ojdbc6-11.2.0.4驱动jar包 &lt;!-- oracle 驱动 --&gt; &lt;groupId&gt;com.oracle.ojdbc&lt;/groupId&gt; &lt;artifactId&gt;ojdbc6 &lt;version&gt;11.2.0.4 &lt;/dependency&gt;

    Oracle-ojdbc最新驱动 ojdbc14-10.2.0.4.0.jar

    Oracle-ojdbc最新驱动 ojdbc14-10.2.0.4.0.jar 是Oracle数据库连接Java应用程序的重要组件,它是Oracle公司提供的JDBC(Java Database Connectivity)驱动程序。JDBC是Java平台上的一个标准接口,它允许Java应用程序...

    Oracle JDBC驱动ojdbc6-11.2.0.2、ojdbc6-11.2.0.4

    在本文中,我们将深入探讨Oracle JDBC驱动的两个版本——ojdbc6-11.2.0.2和ojdbc6-11.2.0.4,以及它们在Java开发中的应用。 首先,JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种类型的数据库...

    ojdbc8-19.3.0.0驱动包

    oracle-11g-ojdbc8-19.3.0.0驱动包 &lt;!-- oracle 驱动 --&gt; &lt;groupId&gt;com.oracle.ojdbc&lt;/groupId&gt; &lt;artifactId&gt;ojdbc8 &lt;version&gt;19.3.0.0 &lt;/dependency&gt;

    Oracle驱动包 ojdbc6-11.2.0.4.0-atlassian-hosted.jar

    Oracle驱动包`ojdbc6-11.2.0.4.0-atlassian-hosted.jar`是Oracle公司为Java应用程序提供的一种数据库连接驱动,主要用于与Oracle数据库进行交互。这个驱动包是Oracle JDBC Thin驱动的特定版本,适用于Java 6环境。在...

    加载同一类型但是版本不同JDBC驱动

    当应用程序需要同时连接到多个相同类型的数据库,例如Oracle 11g和Oracle 19c,而这两个版本的JDBC驱动并不完全兼容时,我们需要自定义加载策略来处理这种情况。Oracle 11g和19c的JDBC驱动(ojdbc)可能具有不同的类...

    spring-jdbc-oracle-ojdbc-1.0.0.jar

    spring-jdbc-oracle-ojdbc-1.0.0.jar 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。

    Oracle驱动包ojdbc6-11.2.0.3

    这个版本的驱动符合Java SE 6(Java Development Kit, JDK 6)的规范,因此被称为ojdbc6。下面将详细介绍Oracle JDBC驱动的原理、使用方法以及ojdbc6-11.2.0.3版本的关键特性。 1. JDBC驱动类型: Oracle JDBC驱动...

    Oracle-ojdbc14-11.1.0.6.0 And ojdbc6.zip

    总的来说,"Oracle-ojdbc14-11.1.0.6.0 And ojdbc6.zip"这个压缩包提供了两个重要的Oracle JDBC驱动,使得Java开发者能够方便地连接并操作Oracle数据库。选择正确的驱动版本是关键,同时理解如何正确配置和使用这些...

    ojdbc6--oracle数据库连接驱动.rar

    ojdbc6是Oracle JDBC驱动的第六个主要版本,适用于Java 6环境,支持Oracle数据库10g、11g及12c的部分版本。 在Java程序中,我们通常使用以下步骤来建立与Oracle数据库的连接: 1. 添加ojdbc6驱动到项目类路径:...

    ojdbc6-11.2.0.3.jar和ojdbc6.jar

    ojdbc6-11.2.0.3.jar和ojdbc6.jar是两个非常重要的Oracle JDBC驱动包,它们在Java开发中扮演着至关重要的角色。 ojdbc6-11.2.0.3.jar是Oracle JDBC驱动程序的一个特定版本,适用于Oracle数据库11g Release 2(11.2....

    oracle-ojdbc6-11.2.0.1.0.jar

    `ojdbc6-11.2.0.1.0.jar`是Oracle JDBC驱动程序的一个版本,专为Java 6设计。这个特定的版本支持Oracle数据库11g Release 2,提供对SQL和PL/SQL的接口,以及事务处理、并发控制和其他数据库操作。 在Maven项目中,...

    Oracle9数据库驱动ojdbc6-11.2.0.1.0.jar

    ojdbc6-11.2.0.1.0.jar文件是Oracle为Java应用程序提供的一个JDBC驱动包,专门用于连接Oracle 9.x版本的数据库。 1. JDBC(Java Database Connectivity):JDBC是Java语言中用来规范客户端程序如何访问数据库的应用...

    ojdbc7-oracle驱动包

    在Java 7(JDK 7)时代,Oracle提供了两个主要的JDBC驱动版本:ojdbc6和ojdbc7。ojdbc6是针对JDK 6的驱动,而ojdbc7则是为JDK 7设计的。这两个驱动虽然都可以在JDK 6和JDK 7环境下运行,但ojdbc7包含了对JDK 7新特性...

    ojdbc6-11.2.0.4.0-atlassian-hosted_jar.zip

    ojdbc6-11.2.0.4.0-atlassian-hosted.jar是Oracle公司为Java应用程序提供的一个特定版本的JDBC驱动程序,用于连接到Oracle 11g数据库。这个版本的驱动包特别适用于Atlassian产品,如Jira、Confluence等,这些产品...

    数据库驱动ojdbc6-11.2.0.1.jar

    这个版本的驱动是Oracle 11g Release 2的一部分,它支持Java 6平台,因此被称为ojdbc6。在本文中,我们将深入探讨ojdbc6驱动的工作原理、安装与配置,以及如何在实际项目中使用。 1. **JDBC驱动概述** JDBC是Java...

    ojdbc6-11.2.0.4.0-atlassian-hosted.jar驱动.rar

    标题中的"ojdbc6-11.2.0.4.0-atlassian-hosted.jar驱动.rar"是一个Oracle数据库连接驱动的压缩文件,其中包含了ojdbc6版本为11.2.0.4.0的驱动程序,这个版本是专门为Atlassian的产品定制的。Atlassian是一家知名的...

Global site tag (gtag.js) - Google Analytics