首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

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

2012-10-18 
自定义类加载器----一个应用里同时加载两个版本的OJDBC驱动对表里字段类型为:DATE不同版本的OJDBC驱动包使

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

对表里字段类型为:DATE

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

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

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

?

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

A1

System.out.println(Connection.class.getClassLoader()+":"+ conn+"==="+conn.getClass().getClassLoader());结果为:null:oracle.jdbc.driver.OracleConnection@12a0f6c===java.net.URLClassLoader@4f1d0dnull: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();

因为第二种过时了。

热点排行