Pergunta

Foi-me dada uma exigência onde eu preciso para suportar múltiplos bancos de dados na mesma instância, para suportar multi-tenancy. Cada DB tem um esquema idêntico. Os usuário faz em um banco de dados específico, escolhendo entre uma lista e todas as chamadas subsequentes vão para que a DB até que encerrar a sessão.

Eu quero hot swap a fábrica de sessão dentro de um único HibernateDaoTemplate com base em um parâmetro fornecido pelo cliente.

posso encontrar um monte de coisas sobre as fontes de dados hot-swap (e todas as questões de transação associados com isso), mas eu quero fábricas de sessão Hot Swap -. Mantendo todo o cache para cada

O que é a maneira mais fácil de fazer isso? Configurar um HotSwappableTarget para o DaoTemplate? Alguém pode me aponte para amostras de como fazer isso?

Foi útil?

Solução

Se todas as bases de dados são idênticos, então eu posso sugerir o uso de um único SessionFactory e fornecendo suas próprias implementações para o DataSource e cache que são realmente "tenant-aware". (A implementação destes é bastante trivial: basta manter um mapa da id inquilino -> cache de reais / verdadeira fonte de dados e, em seguida, delegar todas as chamadas para o apropriado). Configure o único SessionFactory de usar o seu inquilino-aware Cache e DataSource. A ThreadLocal pode ser usado para fazer a identificação do inquilino da solicitação atual disponível para qualquer código que precisa saber sobre ele.

Eu tenho usado essa abordagem antes com sucesso de apoio multi-tenancy.

Outras dicas

Onde eu costumava trabalhar fizemos esta via ThreadLocal seguinte este guiar. Acabamos utilizado um SessionFactory e troquei de fonte de dados com base em uma variável de sessão que o usuário poderia mudar enquanto estiver conectado. não me lembro os detalhes exatos, mas se você estiver interessado posso desenterrar mais algumas informações em nosso implementação.

Dito isto, porém, os rapazes no meu antigo local de trabalho estão agora se afastando esta abordagem e para um banco de dados sharded. Definitivamente uma solução mais elegante que eu recomendo que você dê uma olhada.

estender sua classe DAO de HibernateDaoSupport, em seguida, chamar setSessionFactory () método, para fazer o hot swap dos bancos de dados

Você também pode dar uma olhada no projeto Hibernate Shards:

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

... que é focada em adicionar suporte para o particionamento horizontal para o Hibernate Core. Ainda não cobre o API full Hibernate, mas suporta uma grande parte dele (que pode ou não pode ser suficiente para as suas necessidades). Claro, eles estão trabalhando para uma cobertura completa.

Eu também tentei o provedor de cache via ThreadLocal e a parte difícil foi fazer a troca a quente na cache, você tem que certificar-se da SessionFactory não tem nenhum sessões ativas associar com ele. Agora, eu acho que há uma solução muito melhor:., Utilizando a configuração java Spring 3, você pode criar seu SessionFactory inquilino-aware dinamicamente e deixe Primavera para fazer o gerenciamento de cache para você

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top