2011-11-10 19 views
5

Sto usando Spring MVC + ibernazione + due databaseChange fagiolo proprietà/valore in fase di esecuzione in primavera

Così, per esempio: creo 2 sessionFactories. sessionFactory1 (utilizzando datasource1) e sessionFactory2 (utilizzando datasource2).

Potrebbe essere possibile modificare sessionFactory1 o sessionFactory2 in sessionFactory in fase di runtime in modo che i dao/s li riferimenti. sessionFactory è già avviato automaticamente a tutti i dao/s.

Lo sto cercando proprio ora penso che la configurazione possa aiutarmi, ma non ne sono sicuro.

Sto provando AbstractRoutingDataSource ma non penso che sia d'aiuto.

+0

qualcuno conosce la soluzione ?? – precursor

+0

non sono sicuro di averlo capito, si potrebbe iniettare la fabbrica giusta in ogni DAO? – aishwarya

+1

Ok, ora sono in grado di modificare il database che utilizzo utilizzando AbstractDataSource con l'aiuto di http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ – precursor

risposta

1

Solitamente Spring collega i bean all'avvio dell'applicazione, quindi il "ricablaggio" (sostituzione dei riferimenti a sessionFactory1 con riferimenti a sessionFactory2 in runtime) non sembra facile da implementare.

Forse potresti implementare un "proxy bean" collegato ai tuoi oggetti DAO e modificare "target SessionFactory" del tuo proxy bean.

0

AbstractRoutingDataSource funzionerà per voi.

In primo luogo è necessario creare una classe che memorizzerà l'attuale DB in 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(); 
    } 

} 

Avrai bisogno di creare una classe che estende questo e implementa determineCurrentLookupKey(), e restituire il db corrente che avete nel vostro supporto di contesto:

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

public class MyRoutingDataSource extends AbstractRoutingDataSource { 

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

Vedere l'esempio http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/. Ha funzionato bene per me.

Problemi correlati