2011-11-10 11 views
5

estoy usando mvc spring + hibernate + dos bases de datosCambio frijol propiedad/valor en tiempo de ejecución en primavera

Así, por ejemplo: que crear 2 sessionFactories. sessionFactory1 (usando datasource1) y sessionFactory2 (usando datasource2).

¿Sería posible cambiar sessionFactory1 o sessionFactory2 a sessionFactory en tiempo de ejecución para que los dao/s haga referencia a ellos. sessionFactory ya está auto-conectado a todos los dao/s.

Lo estoy buscando ahora mismo Creo que @Configuration puede ayudarme, pero no estoy seguro.

Estoy intentando usar AbstractRoutingDataSource pero no creo que sea de ayuda.

+0

¿Alguien sabe la solución? – precursor

+0

no estoy seguro de que lo entiendo, ¿podría inyectar la fábrica correcta en cada DAO? – aishwarya

+1

Ok, ahora puedo cambiar la base de datos que uso utilizando AbstractDataSource con la ayuda de http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ – precursor

Respuesta

1

Normalmente, Spring conecta sus beans al inicio de la aplicación, por lo que "volver a cablear" (reemplazar las referencias a sessionFactory1 con referencias a sessionFactory2 en tiempo de ejecución) no parece fácil de implementar.

Quizás podría implementar un "proxy bean" que está conectado a sus objetos DAO y cambiar la "Session SessionFactory" de su bean proxy.

0

AbstractRoutingDataSource funcionará para usted.

En primer lugar tendrá que crear una clase que almacenará la corriente DB en uso:

public class MyContextHolder { 

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); 

    public static void setDBContext(String dBContext) { 
     contextHolder.set(dBContext); 
    } 

    public static String getDBContext() { 
     return (String) contextHolder.get(); 
    } 

    public static void clearDBContext() { 
     contextHolder.remove(); 
    } 

} 

Tendrá que crear una clase que se extiende éste e implementa determineCurrentLookupKey(), y devuelva el db actual que tiene en su soporte de contexto:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 

public class MyRoutingDataSource extends AbstractRoutingDataSource { 

    @Override 
    protected Object determineCurrentLookupKey() { 
     return MyContextHolder.getDBContext(); 
    } 
} 

véase el ejemplo en http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/. Funcionó bien para mí.

Cuestiones relacionadas