2012-03-07 105 views
5

昨天我遇到了一个大问题。在我当前的项目中,我使用Oracle的JDBC的ojdbc6实现进行连接,但也需要处理例如oracle 8数据库,这对于此JAR是完全不可能的。 你会说我应该使用ojdbc14作为例子,这对一些测试来说是正确的,但是让我们假设稍后我需要处理来自同一供应商的两种数据库,但我们知道现在没有用于的实现和我需要有那些同时加载。相同的接口(不仅仅是相同的接口,相同的类结构,只是内部的不同实现!),相同的URL连接前缀 - > JDBC连接将使用一个驱动程序,但我无法加载它们中的多个。所以现在怎么办?处理来自同一供应商的多个JDBC驱动程序

  • 我的第一个想法是不同的类加载器加载的JAR,也许我可以与彼此分开相同的类加载相同的封装结构?我真的不这么认为,也许那是我的一个愚蠢的想法。这可能也是一个普遍的问题,后来不是仅仅使用JDBC驱动程序,所以即使你不能回答我的问题,但你知道这里缺少什么,请告诉我

  • 即使我可以单独加载类的实现相同的类名称,当创建连接以使用EXACT驱动程序而不是基于连接url的前缀找到连接时,我如何告诉DriverManager? (我的意思是jdbc:oracle:thin例如)。

现在我觉得自己像一个总哑巴,因为我觉得这并不是一个完全不平凡的想法在Java世界中来处理,但我完全不知道如何处理。

感谢你们提前

+1

我不知道,使用Oracle 8 *是*漂亮非凡。 – skaffman 2012-03-07 10:27:57

回答

5

你确实有几个选项:

  1. 你可以尝试加载从不同的类加载器的驱动程序。如果你只需要在你的应用程序中使用纯JDBC,那么这将起作用我怀疑你会让Hibernate使用这样的设置。最后,你将不得不运行代码,你将需要从这两个类加载器中看到实例,在这里,你将得到ClassCastException(两个具有相同全限定名的类在从不同的类加载器加载时是不同的) 。

  2. 您可以将应用程序分为两部分。第二个是一个小型服务器,它接受来自原始应用程序的命令并将它们转换为数据库的JDBC。小型服务器与Oracle 8进行对话,而您的应用只与一个数据库进行通信。

    这种方法将允许您将两个问题完全分开,但您无法在两个数据库上运行联接。

  3. 您可以使用CREATE DATABASE LINK链接新数据库中的旧Oracle 8数据库。这使旧表格看起来好像它们是新数据库的一部分。您的应用只能与一个数据库进行会谈,Oracle会在内部处理这些细节

    也许Oracle 8对于这个工作太旧了,但我肯定会试一试。

  4. Oracle JDBC驱动程序更符合您的预期。当你说“这个JAR完全不可能”时,你是否尝试呢?过去,我使用Oracle 10驱动程序连接到Oracle 7。并不是每个功能都支持,但我可以运行标准查询和更新。

+0

感谢您的回答。我会把第一个版本作为第二版,对于我们的目的来说太慢了,3是完全不可接受的(这将是一些通用的工具来连接独立的地方),4.是的,也许我会等待你的第一条评论如果我能用驾驶员对我们足够好的东西来解决问题。 第四种方法唯一的问题是,我可能不想在系统中同时使用JDBC驱动程序,也可能其他API在兼容性方面存在问题,也可能下次需要每个版本的2或3个版本等。 – newhouse 2012-03-07 09:20:37

+0

现在只是开放的问题是,第一个评论并没有说明如何处理JDBC的情况,好吧,我可以加载不同的驱动程序相同的类名等,但我怎么可以克服DriverManager的问题,它独立加载驱动程序我?我无法告诉多个驱动程序处理相同的URL。但至少我知道这个方法和想法是正确的。 – newhouse 2012-03-07 09:26:39

+0

很明显,在解决方案#1中,你不能再使用'DriverManager'。 'DriverManager'是一个全局变量,来自父类加载器,每个驱动程序都会尝试使用相同的基本URL('jdbc:oracle:')进行自我安装。您将不得不使用'OracleDataSource'手动创建连接。 – 2012-03-07 10:08:23

-1
#jdbc.properties 
oracle.driver=oracle.jdbc.OracleDriver 
oracle.url=jdbc:oracle:thin:@//localhost/xe 
oracle.user=scott 
oracle.password=tiger 

mysql.driver=com.mysql.jdbc.Driver 
mysql.url=jdbc:mysql://localhost/sales 
mysql.user=root 

mssql.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver 
mssql.url=jdbc:sqlserver://192.168.1.175;databaseName=sales 
mssql.user=dbviewer 
mssql.password=dbviewer 

然后读取属性文件:

class QueryTest2 { 

    public static void main(String[] args) throws Exception{ 
     Properties settings = new Properties(); 
     FileInputStream fin = new FileInputStream("jdbc.properties"); 
     settings.load(fin); 
     fin.close(); 
     String dvr = settings.getProperty(args[0] + ".driver"); 
     String url = settings.getProperty(args[0] + ".url"); 
     String usr = settings.getProperty(args[0] + ".user"); 
     String pwd = settings.getProperty(args[0] + ".password"); 
     Class.forName(dvr); 
     Connection con = DriverManager.getConnection(url, usr, pwd); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery("select pno,price,stock from products"); 
     while(rs.next()){ 
      System.out.printf("%d\t%.2f\t%d%n", rs.getInt(1), rs.getDouble(2), rs.getInt("stock")); 
     } 
     rs.close(); 
     stmt.close(); 
     con.close(); 
    } 
} 
+0

添加阅读这个属性文件通过这样--- – 2016-08-01 10:38:45