Classe Singleton pode ser gargalo num sistema?

Oi gente,

estou com um problema num sistema meu aqui, nós temos um serviço Rest que recebe um alto número de requisições e está muito lento o processamento na hora do rush, basicamente minha arquitetura é essa:

RequestWS > UsuarioService > UsuarioDAO

O UsuarioService é singleton, ele contem as regras de negócio da aplicação, basicamente validação, não contem comportamento…

O que tenho de debug é chega a requisição no RequestWS em 00:00:00 e o evento chega em UsuarioService em 00:00:58, ou seja, tem casos que demora mais de 50segundos pra passar uma chamado e antes disso não faz validaçao NENHUMA, ZERO mesmo.

Como pode uma uma simples chamada de uma classe pra outra demorar esse tempo todo?

Essa classe UsuarioService sendo singleton pode gerar gargalo em função da quantidade de request?

Grata.

Será que esses 58s não são usados para converter o XML/JSON para Objeto?.

Como vc tá usando o UsuarioService(.getInstance)?

Não tem nenhum motivo para a classe ser o gargalo POR SER SINGLETON.
Creio que vc esteja supondo que as chamadas ao método de serviço ficarão enfileiradas à espera de serem executadas, mas não se preocupe isso não acontece.

A NÃO SER QUE… os métodos sejam synchronized. Nesse caso qualquer demora no processamento, acesso ao banco de dados, etc. vai fazer com que as outras chamadas fiquem esperando antes de entrar no método de serviço.

Checa se tem alguma sincronizacao em algum lugar. Vc pode estar serializando os requests sem saber…

Só uma correção, esse webservice com problema é SOAP e não Rest, temos vários serviços aqui e me confundi.

//método do webservice
public String adicionarUsuario(String xmlRequest);

Hum bem lembrado, tem um detalhe aqui que esqueci de passar, após chegar o evento, eu faço a conversão da string que é um xml para objeto assim:

//classe RequestWS
..
// converte a requisição para objeto...
Util.converterXMLUsuario(xmlRequest);

O método de converter o xml

public static Usuario converterXMLUsuario(String xml) {
		String req= "<?xml version='1.0' encoding='iso-8859-1' ?>" + xml;
		XStream xstream = new XStream(new DomDriver());
		xstream.alias("usuario", Usuario.class);
		return (Usuario) xstream.fromXML(req);
		
	}	

Será que pode ser essa conversão que demora isso tudo nos horários de pico?

O UsuarioService é injetado pelo spring, bean singleton…

[quote=saoj]Checa se tem alguma sincronizacao em algum lugar. Vc pode estar serializando os requests sem saber…
[/quote]

Basicamente meu serviço todo se consiste disso:

UsuarioWS

//Meu web service endpoint
@WebService
public class UsuarioWS {

     public String adicionarUsuario(String xmlRequest) {
		
		try {
                       // Ex: o evento chega aqui em 00:00:00hs
			Usuario userReq  = Util.converterXMLUsuario(xmlRequest);
                       //singleton usuarioService
                        return usuarioService.adicionarUsuario(userReq); 
		} 
                 //vários catchs 

	}

}

UsuarioService

public class UsuarioService{

     public String adicionarUsuario(Usuario user) {
		
		try {                          
                        validaCamposObrigatorios(user);
                        // o evento chega aqui em 00:00:50
			usuarioDAO.adicionar(user);
		} 
                 //vários catchs 

	}

}

Eu nunca tive problema com WS, e trabalho da mesma forma que vc, exceto que meus métodos não recebem um XML e sim um Objeto, no seu caso usuário, deixando a transformação do XML -> Objeto para o JAXB(o próprio servidor faz isso).

Vc pode testar chamar o Util.converterXMLUsuario() passando um XML criado manualmente para verificar o tempo de execução, e também ver o desempenho do mesmo parse quando usado JAXB.