2010-10-23 27 views
5

Ứng dụng của tôi dựa trên hibernate để tìm nạp dữ liệu từ máy chủ mysql. Máy chủ mysql này được sao chép sang một cá thể máy chủ mysql khác. Hôm nay, tôi đã có một thời gian chết vì máy chủ cơ sở dữ liệu chính đã đi xuống mà không cần thông báo. Để tránh bất kỳ vấn đề ngẫu nhiên nào trong tương lai, tôi đang định thêm một chức năng cho phép hệ thống kết nối với cơ sở dữ liệu thứ cấp nếu nó tìm thấy chính.Làm thế nào để sử dụng cơ sở dữ liệu như sao lưu/chuyển đổi dự phòng trong hibernate?

Có tồn tại một cách mà theo đó, tôi có thể tận dụng thư viện ngủ đông để bật chức năng này không?

Trả lời

2

Tôi đã tạo lớp sau đây sau khi nhận được mẫu ý tưởng this thread Dường như nó hoạt động tốt. Tôi không biết đây có phải là cách tiếp cận tốt hay không.

package com.vsd.server.hibernate; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
import java.util.Properties; 

import org.apache.commons.lang.StringUtils; 
import org.hibernate.HibernateException; 
import org.hibernate.connection.C3P0ConnectionProvider; 

public class FailoverConnectionProvider extends C3P0ConnectionProvider { 

    String password; 
    String username; 
    String connectionString; 
    String failover_connstring; 

    @Override 
    public Connection getConnection() throws SQLException { 

     Connection conn = null; 

     try { 
      conn = DriverManager.getConnection(connectionString, username, password); 
     } catch (Exception ex) { 
      conn = DriverManager.getConnection(failover_connstring, username, password); 
     } 

     if(conn == null){ 
      throw new IllegalStateException("Database connection was not initialized"); 
     } 

     return conn; 

    } 

    @Override 
    public void configure(Properties properties) throws HibernateException { 
     failover_connstring = properties.getProperty("hibernate.connection.failover.url"); 

     if (StringUtils.isBlank(connectionString) 
       && StringUtils.isBlank(failover_connstring) 
       && StringUtils.isBlank(username) 
       && StringUtils.isBlank(password)) { 
      throw new IllegalStateException("Unable to initialize connection provider for hibernate"); 
     } 
    } 
} 
+1

Đây có thể là một cách khác. Nhưng thực hiện hiện tại của bạn là rất cơ bản (không có kết nối tổng hợp) và IMO không phù hợp để sử dụng sản xuất. –

6

Hôm nay, tôi có một thời gian chết như các máy chủ cơ sở dữ liệu chính được đi xuống mà không thông báo.

Vâng, đó là điều đầu tiên bạn nên sửa (với theo dõi thích hợp).

(...) Có tồn tại cách mà theo đó, tôi có thể tận dụng thư viện ngủ đông để bật chức năng này không?

Theo hiểu biết của tôi, Hibernate không thực sự cung cấp bất kỳ cơ sở nào cho việc này. Cá nhân, tôi sẽ điều tra sự hỗ trợ không thành công của MySQL và trình điều khiển JDBC của nó. Tôi không thể cung cấp một câu trả lời rất cụ thể bởi vì tôi đã không thực hiện điều này với MySQL nhưng đây là một số gợi ý:

Và, như đã đề cập ở cuối liên kết mới nhất ở trên (và cũng có trong this comment):

Bạn cũng có thể muốn điều tra công cụ Cân bằng tải JDBC Pool (lbpol), cung cấp trình bao bọc xung quanh trình điều khiển JDBC chuẩn và cho phép bạn sử dụng các nhóm kết nối DB bao gồm kiểm tra lỗi hệ thống và phân phối tải không đồng đều. Để biết thêm thông tin, hãy xem Load Balancing JDBC Pool (lbpool).

+0

Bạn nghĩ gì về chương trình tôi đã thêm vào ứng dụng? –

+0

Bạn có thể đề xuất một số quy trình giám sát, để theo dõi thích hợp –

+0

@Vijay Đây là một số: [Zenoss] (http://community.zenoss.org/index.jspa), [Centreon] (http://www.centreon.com /), [Opsview] (http://www.opsview.com/downloads/download-opsview-community) –

0

Bạn có thể thử thêm tính năng chuyển đổi dự phòng dữ liệu Cấp nguồn (bất kỳ loại cơ sở dữ liệu nào). Có vài thư viện cho điều đó. Ví dụ:

  1. "Sequoia"
  2. "FODS - Fail-over dữ liệu nguồn"
Các vấn đề liên quan