2010-10-23 14 views
5

Mi aplicación se basa en la hibernación para obtener datos de un servidor mysql. Este servidor mysql se replica en otra instancia del servidor mysql. Hoy, tuve un tiempo de inactividad porque el servidor principal de la base de datos se cayó sin previo aviso. Para evitar cualquier problema accidental futuro, estoy planeando agregar una funcionalidad que permita que el sistema se conecte a la base de datos secundaria si encuentra el primario abajo.¿Cómo usar la base de datos como copia de seguridad/conmutación por error en hibernación?

¿Existe alguna manera de aprovechar la biblioteca hibernate para habilitar esta funcionalidad?

Respuesta

2

He creado la siguiente clase después de obtener una idea del formulario this thread Parece que está funcionando bien. No sé si este es un buen enfoque.

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

Esto podría ser de otra manera. Pero su implementación actual es muy básica (sin agrupación de conexiones) y la IMO no es adecuada para el uso en producción. –

6

Hoy en día, tengo un tiempo de inactividad como el servidor de base de datos primaria se había bajado sin previo aviso.

Bueno, eso es lo primero que debe corregir (con la supervisión adecuada).

(...) ¿Existe alguna manera de aprovechar la biblioteca hibernate para habilitar esta funcionalidad?

Que yo sepa, Hibernate en realidad no proporciona ninguna posibilidad para esto. Personalmente, investigaría el soporte de fail-over de MySQL y su controlador JDBC. No puedo dar una respuesta muy concreta porque no he implementado este con MySQL pero aquí hay algunos consejos:

Y, como se mencionó al la parte inferior del último enlace arriba (y también en this comment):

Es posible que también desee investigar la herramienta Carga de equilibrio JDBC Pool (lbpol), que proporciona un envoltorio alrededor del controlador JDBC estándar y le permite utilizar grupos de conexiones DB que incluyen comprobaciones de fallas del sistema y distribución desigual de carga. Para obtener más información, vea Load Balancing JDBC Pool (lbpool).

+0

¿Qué opinas del programa que agregué a la aplicación? –

+0

¿Puede sugerir algún proceso de supervisión para un seguimiento adecuado –

+0

@Vijay Éstos son algunos de ellos: [Zenoss] (http://community.zenoss.org/index.jspa), [Centreon] (http://www.centreon.com /), [Opsview] (http://www.opsview.com/downloads/download-opsview-community) –

0

Puede intentar agregar la función de conmutación por error a un nivel de fuente de datos (cualquier tipo de base de datos). Hay pocas bibliotecas para eso. Por ejemplo:

  1. "Sequoia"
  2. "FODS - Fail-over de datos de código"
Cuestiones relacionadas