2012-03-07 40 views
5

Tôi gặp phải một vấn đề lớn ngày hôm qua. Trong dự án hiện tại của tôi, tôi sử dụng triển khai thực hiện ojdbc6 của Oracle JDBC cho một kết nối, nhưng tôi cũng cần phải xử lý các cơ sở dữ liệu ví dụ 8 oracle, điều này hoàn toàn không thể với JAR này. Bạn có thể nói rằng tôi nên sử dụng ojdbc14 cho ví dụ là đúng cho một số thử nghiệm, nhưng giả sử rằng sau này tôi sẽ cần xử lý 2 loại cơ sở dữ liệu từ cùng một nhà cung cấp, nhưng chúng tôi biết rằng không có triển khai hiện tại cho BOTH và tôi cần có đồng thời được tải. Giao diện tương tự (và tốt, không chỉ cùng một giao diện, cùng một cấu trúc lớp, chỉ cần thực hiện khác nhau bên trong!), Cùng một tiền tố kết nối URL -> kết nối JDBC sẽ sử dụng một trình điều khiển, nhưng tôi không thể tải nhiều người trong số họ. Giờ thì sao?Xử lý nhiều trình điều khiển JDBC từ SEND VENDOR

  • Ý tưởng đầu tiên của tôi là tải các JAR với các trình nạp lớp khác nhau, có lẽ tôi có thể tải cùng một cấu trúc gói với cùng các lớp được phân tách với nhau? Tôi không thực sự nghĩ như vậy, có lẽ đó là một ý tưởng ngớ ngẩn của tôi. Đây cũng có thể là vấn đề chung sau đó không chỉ với các trình điều khiển JDBC, vì vậy ngay cả khi bạn không thể trả lời câu hỏi của tôi, nhưng bạn biết những gì thiếu ở đây, hãy cho tôi biết

  • Thậm chí nếu tôi có thể thực hiện tải riêng biệt các lớp cùng tên lớp, làm thế nào tôi có thể nói với DriverManager khi tạo kết nối để sử dụng trình điều khiển EXACT thay vì tìm một kết nối dựa trên tiền tố của kết nối? (tôi có nghĩa là jdbc: oracle: thin chẳng hạn).

tôi cảm thấy giống như một tổng câm bây giờ bởi vì tôi nghĩ rằng đây không phải là một ý tưởng hoàn toàn bất thường để xử lý trong thế giới Java, nhưng tôi hoàn toàn không biết làm thế nào để xử lý.

Cám ơn y'all trước

+1

I dunno, sử dụng Oracle 8 * là * khá bất thường. – skaffman

Trả lời

5

Bạn thực sự có một vài lựa chọn:

  1. Bạn có thể thử tải các trình điều khiển từ bộ tải lớp khác nhau. Điều đó sẽ làm việc nếu bạn chỉ cần JDBC thuần túy trong ứng dụng của bạn. Tôi nghi ngờ rằng bạn sẽ nhận được Hibernate để làm việc với một thiết lập như vậy. Cuối cùng, bạn sẽ phải chạy mã nơi bạn sẽ cần phải xem các trường hợp từ cả hai trình nạp lớp và ở đây, bạn sẽ nhận được ClassCastException s (hai lớp có cùng tên đủ điều kiện khác nhau khi chúng được tải từ các trình nạp lớp khác nhau). .

  2. Bạn có thể chia ứng dụng thành hai. Cái thứ hai sẽ là một máy chủ nhỏ có các lệnh từ ứng dụng ban đầu của bạn và chuyển chúng thành JDBC cho cơ sở dữ liệu. Máy chủ nhỏ nói chuyện với Oracle 8 trong khi ứng dụng của bạn chỉ nói chuyện với một cơ sở dữ liệu.

    Cách tiếp cận này sẽ cho phép bạn giữ hai mối quan tâm hoàn toàn riêng biệt nhưng bạn sẽ không thể chạy tham gia trên hai cơ sở dữ liệu.

  3. Bạn có thể liên kết cơ sở dữ liệu Oracle 8 cũ trong cơ sở dữ liệu mới của mình bằng cách sử dụng CREATE DATABASE LINK. Điều đó làm cho các bảng cũ có thể nhìn thấy như thể chúng là một phần của cơ sở dữ liệu mới. Ứng dụng của bạn chỉ nói chuyện với một DB và Oracle xử lý các chi tiết nội bộ.

    Có lẽ Oracle 8 quá cũ để làm việc nhưng tôi chắc chắn sẽ thử.

  4. Trình điều khiển JDBC Oracle tương thích hơn mà bạn có thể mong đợi.Khi bạn nói "điều này hoàn toàn không thể với JAR này", bạn đã thử nó? Tôi đã sử dụng trình điều khiển Oracle 10 để kết nối với Oracle 7 trong quá khứ. Không phải mọi tính năng đều được hỗ trợ nhưng tôi có thể chạy các truy vấn và cập nhật chuẩn.

+0

Cảm ơn câu trả lời. Tôi sẽ lấy phiên bản đầu tiên là 2 sẽ là quá chậm cho mục đích của chúng tôi, 3 là hoàn toàn không thể chấp nhận được (đây sẽ là một số công cụ chung để kết nối các địa điểm độc lập) và 4. vâng, có lẽ tôi sẽ đợi với việc thực hiện bình luận đầu tiên của bạn nếu tôi có thể vượt qua với những thứ có trình điều khiển đủ tốt cho chúng tôi. Vấn đề duy nhất với cách tiếp cận thứ 4 là tôi có thể không chỉ có các trình điều khiển JDBC đồng thời trong hệ thống, có thể các API khác có vấn đề về tính tương thích và có thể lần sau tôi sẽ cần 2 hoặc 3 phiên bản, v.v. – newhouse

+0

Bây giờ chỉ có câu hỏi mở là bình luận đầu tiên không nói cách xử lý trường hợp JDBC ở đâu, ok, tôi có thể tải các trình điều khiển khác nhau với cùng một tên lớp vv, nhưng làm thế nào tôi có thể vượt qua vấn đề của DriverManager. tôi? Tôi không thể nói nhiều trình điều khiển để xử lý cùng một URL. Nhưng ít nhất tôi biết rằng cách tiếp cận và ý tưởng là đúng cách – newhouse

+0

Rõ ràng với giải pháp # 1, bạn không thể sử dụng 'DriverManager' nữa. 'DriverManager' là một biến toàn cầu và xuất phát từ trình nạp lớp cha và mỗi trình điều khiển sẽ cố gắng tự cài đặt bằng cách sử dụng cùng một URL cơ sở (' jdbc: oracle: '). Bạn sẽ phải tạo các kết nối theo cách thủ công bằng cách sử dụng 'OracleDataSource'. –

-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 

Và sau đó đọc các thuộc tính file:

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

thêm đọc tập tin thuộc tính này thông qua như thế này --- –

Các vấn đề liên quan