一个应用里同时加载两个版本的OJDBC驱动_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 一个应用里同时加载两个版本的OJDBC驱动

一个应用里同时加载两个版本的OJDBC驱动

 2011/9/21 8:10:33  cwj158  http://cwj158.iteye.com  我要评论(0)
  • 摘要:对表里字段类型为:DATE不同版本的OJDBC驱动包使用getObject出来的类型不同。ojdbc14_10_2_0_4.jar出来的是java.sql.Dateojdbc14.jar出来的是java.sql.Timestamp但是有的时候,同一个应用里面要访问不同版本的ORACLE数据库,这时就需要同一个应用里面加载两个版本的OJDBC。A1publicclassA1{publicstaticvoidtest1()throwsException{URL[]urls=newURL[2]
  • 标签:一个 应用

对表里字段类型为: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();
		}
	}
}

?

注:

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();

因为第二种过时了。

?

自定义ClassLoader可以使用现成的URLClassLoader且可以指定parent为null,为什么有时还要自己写呢?场景为:

应用的ClassLoader里面加载了1,2,3,4,5个JAR包。

自己的ClassLoader想共享应用的1,2,3,4的JAR包,但不想用5的JAR,这时要自己要在里面排除5,可根据包名。

?

  • ojdbc14_10_2_0_4.jar (1.5 MB)
  • 下载次数: 0
  • ojdbc14.jar (1.1 MB)
  • 下载次数: 0
发表评论
用户名: 匿名