Pessoal, preciso de uma ajuda com relação a que estratégia usar com uma aplicação multi-cliente (SaaS).
Minha aplicação utiliza:
JAVA 8 - CDI -JSF 2.2 - Hibernate 5 - WildFly 10
Gostei de duas soluções.
1- Cada cliente usará um dataSource do Jboss
2- Usar o DataSource compartilhado do Jboss e utilizar um esquema de banco para cada cliente.
Procurei durante esses dias, e ainda não consegui achar uma implementação que configurasse um provider do hibernate que utilizasse o DataSource gerenciado pelo Wildfly.
Segundo a documentação do Hibernate, é preciso além de configurar o persistence.xml (Já está configurado corretamente) e criar uma implementação da classe AbstractDataSourceBasedMultiTenantConnectionProviderImpl.
Está classe serve simplesmente para setar o datasource de acordo com o TENANT escolhido.
public class DataSourceBasedMultiTenantConnectionProviderImpl
extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
private static final long serialVersionUID = -330622142055395154L;
@Resource(mappedName="java:/jboss/datasources/postgresTesteDS")
DataSource dataSource;
@Override
protected DataSource selectAnyDataSource() {
// TODO Auto-generated method stub
return null;
}
@Override
protected DataSource selectDataSource(String tenant) {
// TODO Auto-generated method stub
return null;
}
}
A primeira observação é que fiz um teste cego, apenas passando o datasource atual da aplicação, só pra ver como a classe funcionava. Porém por algum motivo não recebo injetado o datasource do container.
@Resource(mappedName="java:/jboss/datasources/postgresTesteDS")
DataSource dataSource;
Espero que tenham entendido meu cenário atual. E aceito sugestões para mudar caso me leve a um cenário de sucesso.
Agradeço desde já.