Domanda

Mi è stato assegnato un requisito in cui ho bisogno di supportare più database nella stessa istanza, per supportare il multi-tenancy. Ogni DB ha uno schema identico. L'utente accede a un database specifico scegliendo da un elenco e tutte le chiamate successive andranno a quel DB fino alla disconnessione.

Voglio scambiare a caldo il factory di sessione all'interno di un singolo HibernateDaoTemplate basato su un parametro fornito dal client.

Riesco a trovare un sacco di cose su fonti di dati hot-swap (e tutti i problemi di transazione associati a questo) ma voglio scambiare hot factory di sessione - mantenendo tutta la cache per ognuna.

Qual è il modo più semplice per farlo? Configurare un HotSwappableTarget per DaoTemplate? Qualcuno può indicarmi esempi su come farlo?

È stato utile?

Soluzione

Se tutti i database sono identici, allora posso suggerire di utilizzare una singola SessionFactory e fornire le proprie implementazioni per DataSource e Cache che sono effettivamente "a conoscenza dell'inquilino". (L'implementazione di questi è abbastanza banale: basta mantenere una mappa dell'ID tenant - > real cache / real datasource e quindi delegare tutte le chiamate a quella appropriata). Configurare la SessionFactory singola per utilizzare la cache e l'origine dati compatibili con il tenant. Un ThreadLocal può essere utilizzato per rendere l'ID tenant della richiesta corrente disponibile per qualsiasi codice che deve conoscerlo.

Ho usato questo approccio prima di supportare con successo il multi-tenancy.

Altri suggerimenti

Dove lavoravo, lo abbiamo fatto tramite ThreadLocal seguendo questo guida. Abbiamo appena usato una SessionFactory e scambiato l'origine dati in base a una variabile di sessione che l'utente potrebbe cambiare durante il login. Non ricordo i dettagli esatti, ma se sei interessato posso trovare qualche informazione in più sulla nostra implementazione.

Detto questo, però, i ragazzi del mio ex posto di lavoro si stanno allontanando da questo approccio e verso un database frammentato. Sicuramente una soluzione più elegante che ti consiglio di dare un'occhiata.

estendi la tua classe DAO da HibernateDaoSupport, quindi invoca il metodo setSessionFactory (), per eseguire l'hot swap dei database

Puoi anche dare un'occhiata al progetto Hibernate Shards:

http://www.hibernate.org/414.html

... che si concentra sull'aggiunta del supporto per il partizionamento orizzontale a Hibernate Core. Non copre ancora l'API Hibernate completa, ma supporta gran parte di essa (che può essere o non essere sufficiente per le tue esigenze). Certo, stanno lavorando per una copertura completa.

Ho anche provato il provider di cache tramite ThreadLocal e la parte difficile era fare lo hot swap sulla cache, devi assicurarti che SessionFactory non abbia alcuna sessione attiva associata ad esso. Ora, penso che ci sia una soluzione molto migliore: usando la configurazione java Spring 3, puoi creare la tua SessionFactory sensibile ai tenant e lasciare che Spring esegua la gestione della cache per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top