如何在hibernate中使用数据库作为备份/故障转移?

时间:2010-10-23 00:09:31

标签: java mysql database hibernate

我的应用程序基于hibernate从mysql服务器获取数据。这个mysql服务器被复制到另一个mysql服务器实例。今天,由于主数据库服务器在没有任何通知的情况下发生故障,我遇到了停机时间。为了避免任何未来的意外问题,我计划添加一项功能,使系统能够连接到辅助数据库,如果它找到主要数据库。

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

4 个答案:

答案 0 :(得分:7)

  

今天,由于主数据库服务器在没有任何通知的情况下发生故障,我遇到了停机时间。

嗯,这是你应该修理的第一件事(通过适当的监控)。

  

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

据我所知,Hibernate并没有为此提供任何便利。就个人而言,我会调查MySQL及其JDBC驱动程序的故障转移支持。我无法提供一个非常具体的答案,因为我没有用MySQL实现这个,但这里有一些指示:

并且,如上面最新链接(以及this comment)底部所述:

  

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

答案 1 :(得分:3)

我在获得构思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");
        }
    }
}

答案 2 :(得分:0)

您可以尝试将故障转移功能添加到dataSource级别(任何类型的数据库)。这个库很少。例如:

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

答案 3 :(得分:0)