Как использовать базу данных в качестве резервного / аварийного переключения в спящем режиме? - PullRequest
6 голосов
/ 23 октября 2010

Мое приложение основано на спящем режиме для извлечения данных с сервера MySQL.Этот сервер MySQL реплицируется на другой экземпляр сервера MySQL.Сегодня у меня простои, так как основной сервер баз данных вышел из строя без какого-либо уведомления.Чтобы избежать любой случайной проблемы в будущем, я планирую добавить функциональность, которая позволит системе подключаться к вторичной базе данных, если она обнаружит первичную неработоспособность.

Существует ли способ, которым я могу использовать библиотеку гибернациивключить эту функцию?

Ответы [ 4 ]

7 голосов
/ 23 октября 2010

Сегодня у меня простои, так как основной сервер баз данных вышел из строя без какого-либо уведомления.

Ну, это первое, что вы должны исправить (при правильном мониторинге).

(...) Существует ли способ, с помощью которого я могу использовать библиотеку гибернации для включения этой функции?

Насколько мне известно, Hibernate на самом деле не предоставляет никаких средств для этого. Лично я бы исследовал поддержку отработки отказа MySQL и его драйвера JDBC. Я не могу дать очень конкретный ответ, потому что я не реализовал это с MySQL, но вот несколько указателей:

И, как упоминалось в нижней части последней ссылки выше (а также в этот комментарий ):

Возможно, вы также захотите изучить инструмент Балансировка нагрузки JDBC Pool (lbpol), который предоставляет оболочку для стандартного драйвера JDBC и позволяет использовать пулы соединений с БД, которые включают проверки на наличие сбоев системы и неравномерное распределение нагрузки. Для получения дополнительной информации см. Пул JDBC балансировки нагрузки (lbpool) .

3 голосов
/ 23 октября 2010

Я создал следующий класс после получения формы идеи этой темы Кажется, работает хорошо. Я не знаю, подходит ли это вообще.

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");
        }
    }
}
0 голосов
/ 04 февраля 2013

Альтернативный способ проверьте ссылку ниже http://cmanolescu.wordpress.com/2010/05/15/backup-and-restore-database-using-hibernate/

0 голосов
/ 12 января 2011

Вы можете попытаться добавить функцию аварийного переключения на уровне источника данных (любой тип базы данных).Для этого есть несколько библиотек.Например:

  1. "Секвойя"
  2. "FODS - резервный источник данных"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...