Aplicação Java multicliente

4 respostas
jpaejbjava
fer.ferreira6

Galera,

Temos uma aplicação com vários clientes e atualmente usamos um classe onde anotamos todos os EntityManager’s.
Nessa aplicação, usamos EJB e JPA com eclipseLink.

Por exemplo:

@Stateless

@TransactionAttribute(TransactionAttributeType.SUPPORTS)

public class ConexaoManager {
@PersistenceContext(unitName = "conexao1")
private EntityManager conexao1;

@PersistenceContext(unitName = "conexao2")
private EntityManager conexao2;

@PersistenceContext(unitName = "conexao3")
private EntityManager conexao3;

public EntityManager getEntityManager(final String idConexao) {
	if (Domain.CONEXAO1.equals(idConexao)) {
		return this.conexao1;
	} else if (Domain.CONEXAO2.equals(idConexao) {
		return this.conexao2;
	} else if (Domain.CONEXAO3.equals(idConexao) {
		return this.conexao3;
	}		

	return conexao1;
}

}

Só que se essa lista de clientes crescer, acredito que o consumo de memória irá aumentar radicamente.
Sobre isso, tenho algumas dúvidas.

Se o uso de memória vai realmente aumentar a cada novo cliente.
Existe outras formas, pensando num crescimente de clientes, para ser usado e que o consumo de memória não sofra tanto?

4 Respostas

darlan_machado

Toda vez que você precisar criar conexões você vai ter consumo de memória e processamento (não apenas para isso, na verdade).
Você tem opção de mudar o que usa? Para JDBC? Afinal, isso ainda te daria uma série de problemas, mas, menores que o JPA;

fer.ferreira6

Acho que JDBC não seria o ideal, até mesmo porque o sistema já está estabelecido com JPA, usamos NamedQuery’s no sistema inteiro também.
Acredita que instanciando o EntityManager através do EntityManagerFactory eu teria algum ganho de desempenho?
Por exemplo, ao invés de subir 10 clientes junto com a aplicação, eu teria uma classe “ConexaoDAO”, onde dependendo do cliente que faz a chamada, abrir a conexão com o banco?

javaflex

Mas essa é a melhor resposta para sua pergunta.

Um meio termo seria usar JDBCTemplate. Implementações de JPA são pesadas mesmo, para escalar pior ainda.

Se ainda assim insistir com JPA, pesquise sobre multi-tenancy.

Emerzoom

Bom dia!

No meu ponto de vista, é preciso observar todo o fluxo que uma ação do usuário vai percorrer e medir o caminho todo desse fluxo, levando em conta todos os estados de seus TOs, DTOs, DAOs, como queira chamar ou implementar.

Dimensionar o crecimento de uma aplicação somente por uma pequena gama de usuários e não levar em conta quantas transações o sistema vai realizar por essa pequena gama é um erro.

Não adianta a gente querer medir isso dessa forma, pq, se a aplicação precisa conversar com diversos servidores, ou seja, ter diversos datasources, isso significa que temos que ter atenção redobrada no sentido de como vamos trabalhar com esses datasources desde seus usos iniciais até sua finalização.

Mais que isso, ainda tem o problema de como serão construidas as suas consultas no DB, no que tange aos seus joins, inner joins, unions e outras coisas mais.

Se suas queries não estão bem construidas respeitando os relacionamentos, e mesmo que as tabelas não tenham relacionamentos (e olha que ainda sim dá pra se obter uma performance monstruosa, sabendo fazer a consulta corretamente) , existe um grande risco de seu sistema apresentar lentidão e até mesmo “abendar” o servidor.

Considere rever suas transações de DB com um DBA por perto para esses temas.

Falando somente sobre performance, veja essa documentação sobre EJB:

https://docs.oracle.com/cd/E19159-01/819-3681/6n5srlhkj/index.html

Tem esse post aqui, um pouco mais exemplificado:

http://www.precisejava.com/javaperf/j2ee/EJB.htm

E esse aqui, para JPA:

E mais esse:

No mais, considere a possibilidade de levantar um relatório com um De-Para de como sua arquitetura está hoje para como poderia ficar, no caso de um aumento inexperado no consumo dos recursos dela e use como dossiê para apresentar aos seus líderes, pois isso ainda pode te ajudar a conseguir mais “budget” para melhorar seus recursos e deixar a arquitetura “mais fria”.

Criado 5 de fevereiro de 2018
Ultima resposta 6 de fev. de 2018
Respostas 4
Participantes 4