2010-10-23 57 views
5

我的应用程序基于hibernate从MySQL服务器获取数据。这个mysql服务器被复制到另一个mysql服务器实例。今天,由于主数据库服务器在没有任何通知的情况下停机,我得到了停机时间。为了避免将来出现意外问题,我打算添加一项功能,以便系统在发现主服务器失败时连接到辅助数据库。如何在休眠时使用数据库作为备份/故障转移?

是否存在一种方法,我可以利用hibernate库来启用此功能?

回答

2

我已经创建了以下课程后得到一个想法形式this thread 它似乎运作良好。我不知道这是否是一个好方法。

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

此链接可能是另一种方式。但是,您目前的实施非常基础(无连接池),并且IMO不适合用于生产。 – 2010-10-23 01:39:26

6

今天,我得到了停机时间作为主数据库服务器已经走了下来,恕不另行通知。

那么,这是你应该修复的第一件事(通过适当的监测)。

(...)是否存在一种方式,我可以利用hibernate库来启用此功能?

据我所知,Hibernate并没有真正为此提供任何设施。就我个人而言,我将研究MySQL及其JDBC驱动程序的故障切换支持。我不能提供一个非常具体的答案,因为我还没有实现这个与MySQL,但这里有一些指点:

,截至提到上面最新链接的底部(也在this comment):

您可能还想调查负载平衡JDBC池(lbpol)工具,该工具提供标准JDBC驱动程序的包装,并使您能够使用数据库连接池,其中包括检查系统故障和不均匀的负载分布。有关更多信息,请参见Load Balancing JDBC Pool (lbpool)

+0

您如何看待我已添加到应用程序中的程序? – 2010-10-23 01:40:00

+0

你可以建议一些监测过程,以进行适当的监测 – 2010-10-23 02:00:20

+0

@Vijay这里有一些:[Zenoss](http://community.zenoss.org/index.jspa),[Centreon](http://www.centreon.com /),[Opsview](http://www.opsview.com/downloads/download-opsview-community) – 2010-10-23 02:13:57

0

您可以尝试添加故障转移功能dataSource级别(任何类型的数据库)。这方面很少有图书馆。例如:

  1. “红杉”
  2. “FODS - 故障对数据源”