问题是这样:
1、程序需要连接多个的数据库;
2、数据库有多种,可能存在一样的,如两个Oracle,一个DB2;
3、数据库版本不一样,如可能有Oracle8i,9i,10G等;问题是:如何通过动态加载数据库驱动,达到连接多个数据库的目的。ps:分不够另外开贴发。先谢谢各位了。

解决方案 »

  1.   

    看来问题没说清楚
    1、程序只有一个,应用也只有一个;
    2、连接的数据库有多个、多种;
    3、如果把所有版本、种类的数据库驱动放在/APP/lib下,肯定会有打架的问题;文笔不好,见谅!!
      

  2.   

    确实有难度。不过,jdbc 都向下兼容。比如:Oracle8i,9i,10G,你用10G的驱动就可以支持 8i和9i
      

  3.   

    把jar包加载进来
    配置不同数据库的连接字符串就可以了。
    然后根据需要使用即可。
      

  4.   

    个人认为:
       用资源文件会比较好些!
       在资源文件中可以定义好一些KEY然后把你要加载的驱动添加然后按KEY
       读取
    供参考
      

  5.   

    诚招赴日SE(10人)培养方向:常驻日本从事软件开发工作,熟悉日本客户工作习惯、掌握客户的软件开发管理。有机会做真正的对日软件开发的桥梁和管理者。日语要求:能够直接和日本客户进行作业会话,对日开发经验2年以上(如果日语非常好1年也可)。
    技术要求:1.精通1门以上(包括1门)开发语言。会.net、Java、C语言者优先。
            2.精通1种以上(包括1种)数据库。
              有项目管理经验者优先。
    学历要求:大专以上(包括大专),如果是自学考试的情况下,需要有学位证书。
    工作地点:东京、关东地区、名古屋、京都等待遇情况:月工资:25-40万日元
    加班费:  每天平均勤务8小时以上加班费为1800日元以上/H。例:当月勤务时间为260小时,工作日为20天的情况下,加班费为:18万日元。
    年休假:  10天以上
    保  险:   日本和国内(当将个人档案调到大连本社时)都有保险
    其  他:   每年2次员工旅游(目前组织过的旅游地:冲绳2次、韩国1次、今年到塞班)
               员工聚会平均1.5个月一次(公司报销路费和会餐费)。
               报销在日本业余时间学习日语的费用等
                 公司有公寓人力资源顾问:文先生
    Email:[email protected]
    Tel:0411-84509856/84509836
    Mob:13889497710
      

  6.   

    再说问题:
    1、JDBC驱动并不是兼容的,比如说9i的小版本号除.1.30的并不适合8i的驱动;
    这种例子还很多;10G的也不兼容9和8;(to:lianhg(lianhg) )
    2、jar包加载进来,对于相同的数据库驱动,不同版本的串是一样的,但各个
    不同版本的驱动不能互为使用,所以不能直接加载。(to:manyroads(凉茶不二碗) )
    3、to:alex9521(断--言),你的资源文件怎么定义?KEY值是否也是定义到驱动串?
    这问题又回到第一第二了。
      

  7.   

    再说问题:
    1、JDBC驱动并不是兼容的,比如说9i的小版本号除.1.30的并不适合8i的驱动;
    这种例子还很多;10G的也不兼容9和8;(to:lianhg(lianhg) )-- 10G不能访问 8i 和 9i ?!
      

  8.   

    TO:lianhg(lianhg)
      是的,有些小版本并不兼容,问题在与,我们并不知道
    需要连接的数据库是什么版本,所以,必须全部适用;
      

  9.   

    楼主的意思应该是如何实现动态的切换吧。首先要明确的是,你必须自己很清除哪个数据库对应哪个驱动,然后你可以用一个属性文件,分别将这些驱动的名称给配置上 比如driverOracle=*****,driverDB2=****.然后再你程序初始化时,将这些信息加载到内存,就可以用Class.forName(driverDB2)这样的反射机制加载了。
      

  10.   

    楼上两位:larryzhao(Larry.Zhao) ,software_apprentice() 
    请问,所有的数据库驱动(不同种类,不同版本)放哪儿?
      

  11.   

    habinate放在哪呢?
    可以参考一下吧
      

  12.   

    这个需要自己管理ClassLoader。
    想象Tomcat或者WebLogic是怎样管理多个WebApp的。
      

  13.   

    不知道我的理解对不对,lz的一个app程序需要连接多种数据库,(就好像这个程序需要将oracle 9i中的数据读取后插入到oracle 10中一样),所以需要加载多种数据库和不同版本的数据库的不同版本的驱动。
    这样,如果将jar包放在一起,数据库不同还好说,如果相同,就坏了,肯定有一个加载的不对。(比如lz说的Oracle不同版本的驱动不向下兼容)解决办法:自己写一个ClassLoader或者使用现成的ClassLoader,我建议使用现成的URLClassLoader,然后将不同版本的驱动包解压缩(因为URLClassLoader没办法加载jar包中的类),放在不同的目录下,比如C:\\oracle9\\driver和C:\\oracle10\\driver,然后将创建两个URLClassLoader实例,将他们的加载目录设置为上面的两个目录,在需要加载数据库的时候,就可以使用DriverManager.registerDriver(driver)注册两个驱动了,但是具体能不能使用,我还没有试过,lz可以尝试一下。
    上面的方法至少解决了驱动类混淆的问题^_^
      

  14.   

    漏说了一个步骤:“然后将创建两个URLClassLoader实例,将他们的加载目录设置为上面的两个目录,在需要加载数据库的时候,”后面,应该调用Driver driver9i = (Driver)urlClassLoader9i.loadClass("驱动类全名");
    DriverManager.registerDriver((Driver)driver9i.newInstance())
    10i的做法是一样的
      

  15.   

    To:DeepNightTwo(深夜两点)
    这两天出差,没有及时查看,不好意思。
    感觉你的想法蛮有建设性的,马上试一下,可以就给分。
      

  16.   

    可以仿照struts等框架的做法把驱动的路径做成一个path,然后根据不同的path加载驱动.
      

  17.   

    TO:DeepNightTwo(深夜两点) ,
    没试出来,不知道哪个环节出错,我一会贴代码;
    TO:zhwh(韩信),
    你的想法刚好跟我一样,不知道有没有更完整一点的想法?
      

  18.   

    目录
    webapp
    |-lib
      |-oracle10g
    代码如下:
    /*************************************************/
    URL u = new URL("file:lib/oracle10g");
    URLClassLoader oracle10g = new URLClassLoader(new URL[]{u});
    Class c = oracle10g.loadClass("oracle.jdbc.driver.OracleDriver");
    driver = (Driver)c.newInstance();
    DriverManager.registerDriver(driver);
    conn = DriverManager.getConnection(connStr, usr, pwd);System.out.println(conn.toString());
    /*************************************************/运行结果:
    java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:161)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:273)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:327)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:347)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:150)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:31)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:563)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.test.ProcConnTest.main(ProcConnTest.java:37)
      

  19.   

    错了错了,报的错是这个:
    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.test.ProcConnTest.main(ProcConnTest.java:34)在我看来,URLClassLoader似乎没有起到作用。
      

  20.   

    at com.test.ProcConnTest.main(ProcConnTest.java:37)at com.test.ProcConnTest.main(ProcConnTest.java:34)
    37、34行各是哪行?知道哪行出错才好弄
      

  21.   

    TO ALL:已经解决了。感谢DeepNightTwo(深夜两点) 的想法,xiaomad() ,zhwh(韩信)的提议。给分了。