2012-05-15 45 views
13

Tôi có một ứng dụng sử dụng bốn cơ sở dữ liệu ở các vị trí địa lý khác nhau. Tất cả các cơ sở dữ liệu chứa cùng một bảng và chỉ có tên cơ sở dữ liệu là khác nhau tùy theo vị trí. Tôi phải tạo một số báo cáo trong ứng dụng sử dụng dữ liệu từ mỗi cơ sở dữ liệu. Điều gì sẽ là cách thích hợp để tạo ra những kết nối cơ sở dữ liệu từ một ứng dụng java và có một mẫu thiết kế phù hợp cho nhiệm vụ này mà tôi có thể sử dụng không?Cách tạo nhiều kết nối cơ sở dữ liệu cho các cơ sở dữ liệu khác nhau trong java

Trả lời

7

Như các bạn đã không được gắn thẻ câu hỏi của bạn với bất kỳ này, hibernate, JPA, ORM, tôi giả sử bạn đang đối phó với JDBC đồng bằng.

Có nói rằng, tôi đề nghị bạn có một lớp DAO để đối phó với cơ sở dữ liệu bên dưới và để lại chi tiết kết nối với các triển khai cụ thể. Bạn có thể định cấu hình các chuỗi kết nối của mình trong một số tệp .properties, cho phép nói.

[Bổ sung]

Bạn cũng có thể tận dụng các nhà máy DAO, một thực hiện Abstract Factory hoặc mẫu Factory mathod, nào phù hợp với ở đây.

[Liên kết]

+0

nhưng sau đó bạn sẽ có nhiều kết nối db như thế nào? –

+0

@munna: Mỗi lần triển khai DAO sẽ biết Datasource của nó. –

1

Cách lý tưởng để đạt được điều này là sử dụng hệ thống đa chiều như OLAP. Nhưng hãy xem liệu bạn có thể tạo ra một khung nhìn từ những cơ sở dữ liệu đó hay không. Sau đó, bạn chỉ cần truy vấn chế độ xem (tức là chỉ một kết nối cơ sở dữ liệu). Ngoài ra, bạn vẫn có thể sử dụng nhiều kết nối cơ sở dữ liệu nếu muốn.

1

Bạn có thể xử lý nhiều kết nối dễ dàng bằng công cụ ORM như Hibernate .. Bạn có thể chỉ định từng kết nối trong một tệp cấu hình riêng biệt và khởi tạo kết nối được yêu cầu bằng cách tạo nhà máy phiên mới mỗi lần.

cách khác sẽ được sử dụng nguồn dữ liệu và JNDI: Java connecting to multiple databases

Tôi nghĩ rằng bạn có thể sử dụng một sự kết hợp của mô hình Nhà máy và mô hình Singleton cho mục đích này.

3

Có nhiều cách để bạn có thể đạt được điều này:

  1. Nếu bạn đang sử dụng bất kỳ container Java EE mà hỗ trợ giao dịch phân phối sau đó bạn có thể sử dụng có chức năng.
  2. Nếu bạn đang sử dụng JDBC đơn giản thì bạn sẽ phải duy trì kết nối của riêng mình cho mọi cơ sở dữ liệu. Đối với JDBC:
    1. Cung cấp tất cả chi tiết kết nối
    2. Có mặt tiền mang đến cho bạn đối tượng mong muốn bằng cách gọi DAO chung trừu tượng.
    3. Có một nhà máy tạo dao dựa trên kết nối.
  3. Sử dụng các công cụ ORM như Hibernate, nơi bạn có thể sử dụng cấu hình cho nhiều cơ sở dữ liệu. Tutorial.
  4. Nếu bạn đang sử dụng Spring, thì bạn có thể định cấu hình một nguồn dữ liệu cho mỗi cơ sở dữ liệu. Docs

Design Patterns:

  • Facade Pattern - cho ẩn sự phức tạp và sử dụng cơ sở dữ liệu nhiều.
  • Nhà máy - Trong trường hợp bạn tự quản lý kết nối cơ sở dữ liệu.
  • Singleton - Đối với datasources
0

là rất dễ dàng :)

1.Create một nguồn dữ liệu để thử kết nối đến DB

public DataSource getDataSource(String db) throws Exception { 
DataSource dt = null; 
InitialContext ic = null; 
try { 
    if(db.trim().equals("you_database_name")) { 
     dt = (DataSource)ic.lookup("jdbc/connection_name"); 
    } else if(db.trim().equals("you_database_name")) { 
     dt = (DataSource) ic.lookup("jdbc/connection_name"); 
    } 
    return dt; 
} catch(NamingException n) { 
    throw new Exception("Err getDataSource (ServiceLocator) NamingException - " + n.getMessage()); 
} 

2.Create một DataBase lớp, nhớ đóng tất cả các kết nối trong thời điểm này.

public class DataBases { 
public YouNameDataSourceClass dataSrc; 
public DataBases() throws Exception { 
    super(); 
    dataSrc = new YouNameDataSourceClass.getDataSource(); 
} 
public Connection getConnectionAS400() throws Exception { 
    return locator.getDataSource("you_database_name").getConnection(); 
} 

public Connection getConnectionOracle() throws Exception { 
    return locator.getDataSource("you_database_name").getConnection(); 
} 

public Connection getConnectionSQLServer() throws Exception { 
    return locator.getDataSource("you_database_name").getConnection(); 
} 
} 

Cái nhìn tốt.

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