Melhorar performance de aplicativo desktop rodando em JWS

Prezados Srs.

Tenho um aplicativo em desenvolvimento, usando as tecnologias: Java SWING, JPA, EclipseLink, PostgreSQL e iReport. Desenvolvido para rodar em ambiente desktop, cliente x servidor com Java Web Start. Atualmente o primeiro módulo do sistema já esta liberado em ambiente de produção. Na rede local roda perfeitamente, agora quando o acesso é de fora da minha rede, o aplicativo leva em torno de 7:30" para acessar ao banco de dados, e isto está inviabilizando o acesso do aplicativo via HTTP.
Bom para iniciarmos a discussão. O acesso ao banco é feito através de uma classe que implementa o padrão Singleton, segue trecho da classe:

   private GnsSvrGrs1a() {
    	// Mudando as propriedades da conexão.
    	propriedades = new HashMap<String, Object>();
    	propriedades.put(PersistenceUnitProperties.CLASSLOADER, this.getClass().getClassLoader());
    	
    	if (path != null && path.getPath().contains("XXX.XX.XXX.XXX")){
    		propriedades.put(PersistenceUnitProperties.JDBC_USER, "usuario");
    		propriedades.put(PersistenceUnitProperties.JDBC_PASSWORD, "senha");
    		propriedades.put(PersistenceUnitProperties.JDBC_URL, "jdbc:postgresql://XXX.XX.XXX.XXX:5432/genesis");
    		propriedades.put(PersistenceUnitProperties.JDBC_DRIVER, "org.postgresql.Driver");
    	}

    	try {
    		EntityManagerFactory emf = new PersistenceProvider().createEntityManagerFactory("GENESIS-GERAIS", propriedades);
    		em = emf.createEntityManager();
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    }// GnsSvrGrs1a.

    // Método garante sempre a mesma instância ativa.
    public static GnsSvrGrs1a getInstancia() {
        if (instanciaGnsSvrGrs1a == null) {
            instanciaGnsSvrGrs1a = new GnsSvrGrs1a();
        } 
        return instanciaGnsSvrGrs1a;
    }// getInstancia.

Agora vejam a discrepância, se gerar um jar deste projeto e executar na máquina cliente que está fora da minha rede local, sem a participação do JWS a inicialização do aplicativo baixa para 00:15", sete minutos e quinze segundos a menos do que o aplicativo estando sendo executado através do JWS.
Alguém tem conhecimento de alguma forma de melhorar o performance de aplicativos rodando sobre o JWS, nestas características que citei? Não quero executar a aplicação fora do JWS, pois o que mais me agradou fazendo uso do JWS é a facilidade de atualizações do aplicativo.

Olavo Jr.

Você já reparou se a aplicação está sendo baixada para o cliente toda vez que a mesma é aberta? pode ser algum erro de configuração do seu JWS.

Cara, alguém teve esse mesmo problema. Não lembro exatamente onde, acho que foi na lista de emails do RSJUG, tenta procurar por lá.
https://rsjug.dev.java.net/servlets/SummarizeList?listName=java-l

Caro gilsonpolido,

Infelizmente este não é o caso, a aplicação inicia-se automaticamente sem a atualização dos pacotes, a demora mesmo está na conexão com o banco de dados.

Olavo Jr.

[quote=fabiofalci]Cara, alguém teve esse mesmo problema. Não lembro exatamente onde, acho que foi na lista de emails do RSJUG, tenta procurar por lá.
https://rsjug.dev.java.net/servlets/SummarizeList?listName=java-l[/quote]

Caro fabiofalci,

Acredito que não foi na lista do RSJUG que você tenha visto, pois fiz diferentes pesquisas de procura e não encontrei nada relacionado ao meu problema.

Olavo Jr.

Tenta na lista do soujava então https://soujava.dev.java.net/servlets/SummarizeList?listName=java-list

Caro gilsonpolido,

Infelizmente este não é o caso, a aplicação inicia-se automaticamente sem a atualização dos pacotes, a demora mesmo está na conexão com o banco de dados.

Olavo Jr.[/quote]
Mas que loucura tche, isso aí de fazer a própria aplicação JWS acessar direto o banco de dados me parece doidera.
Eu sugeriria criar alguma fachadazinha no lado do servidor para acessar o banco de dados e deixar a aplicação JWS acessar apenas essa fachadazinha, já que a comunicação entre o servidor e o banco de dados deve ser bem mais rápida do que a comunicação entre o aplicativo JWS e o banco de dados.
Acho que é relevante recomendar que essa fachadazinha ou camada abstratora que tu deverá deixar no servidor venha a entregar os dados para a aplicação JWS da forma mais mastigada e digerida possível.

Inté.

Caro gilsonpolido,

Infelizmente este não é o caso, a aplicação inicia-se automaticamente sem a atualização dos pacotes, a demora mesmo está na conexão com o banco de dados.

Olavo Jr.[/quote]
Mas que loucura tche, isso aí de fazer a própria aplicação JWS acessar direto o banco de dados me parece doidera.
Eu sugeriria criar alguma fachadazinha no lado do servidor para acessar o banco de dados e deixar a aplicação JWS acessar apenas essa fachadazinha, já que a comunicação entre o servidor e o banco de dados deve ser bem mais rápida do que a comunicação entre o aplicativo JWS e o banco de dados.
Acho que é relevante recomendar que essa fachadazinha ou camada abstratora que tu deverá deixar no servidor venha a entregar os dados para a aplicação JWS da forma mais mastigada e digerida possível.

Inté.[/quote]

Caro KWill

A princípio ainda não considero a execução do aplicativo via JWS uma “loucura”. Estou justamente testando a viabilidade deste acesso. Não sei se está acompanhando esta thread, mas há dois fatores que favorecem o uso deste modelo. Primeiro se acesso o gerenciador de banco de dados do PostgreSQL, pgAdmin III, fora da rede local, acessando o banco de dados, o login é quase que instantâneo, sem delay aparente. Segundo como já dito anteriormente, se empacoto o aplicativo em um jar e o executo sem a administração do JWS e também fora da rede local, leva em torno de 00:15" segundos para criar a conexão no padrão Singleton e trazer os dados de módulos e usuários para seleção do login.

Olavo Jr.

Caro fabiofalci

Infelizmente, também neste local embora tenha encontrado algumas threds com relação a JWS, nada que pudesse aproveitar.

Olavo Jr.

[quote=Olavo-Brito]
Caro KWill

A princípio ainda não considero a execução do aplicativo via JWS uma “loucura”. Estou justamente testando a viabilidade deste acesso. Não sei se está acompanhando esta thread, mas há dois fatores que favorecem o uso deste modelo. Primeiro se acesso o gerenciador de banco de dados do PostgreSQL, pgAdmin III, fora da rede local, acessando o banco de dados, o login é quase que instantâneo, sem delay aparente. Segundo como já dito anteriormente, se empacoto o aplicativo em um jar e o executo sem a administração do JWS e também fora da rede local, leva em torno de 00:15" segundos para criar a conexão no padrão Singleton e trazer os dados de módulos e usuários para seleção do login.

Olavo Jr.[/quote]
Não estou dizendo que e a execução do aplicativo via JWS em si é uma loucura, o que considerei loucura é ter que expor a conexão via rede ao banco de dados diretamente à aplicação JWS.
Se eu estou com a aplicação JWS rodando desse jeito na minha máquina, e o protocolo de rede do PostreSQL for meio 'bobo", eu posso chegar via sniffer e descobrir:

  • o host onde está o banco de dados;
  • a porta onde o banco de dados está aceitando conexões;
  • o login e a senha usados para acessar o PostgreSQL.

Pior ainda, dependendo do caso, eu poderia usar um disassembler de bytecodes para tentar extrair essas informações aí em cima, se elas estiverem no arquivo jar a ser distribuído via JWS.

Imagine só o perigo que seria se as aplicações “bankline” da vida rodando nas máquinas dos clientes de diversos bancos conectassem direto nos bancos de dados das instituições financeiras…

O que muitos fazem hoje em dia é fornecer uma interface, normalmente em SOAP/WebService para fornecer algum tipo de informação/executar alguma operação.

Inté.

[quote=KWill][quote=Olavo-Brito]
Caro KWill

A princípio ainda não considero a execução do aplicativo via JWS uma “loucura”. Estou justamente testando a viabilidade deste acesso. Não sei se está acompanhando esta thread, mas há dois fatores que favorecem o uso deste modelo. Primeiro se acesso o gerenciador de banco de dados do PostgreSQL, pgAdmin III, fora da rede local, acessando o banco de dados, o login é quase que instantâneo, sem delay aparente. Segundo como já dito anteriormente, se empacoto o aplicativo em um jar e o executo sem a administração do JWS e também fora da rede local, leva em torno de 00:15" segundos para criar a conexão no padrão Singleton e trazer os dados de módulos e usuários para seleção do login.

Olavo Jr.[/quote]
Não estou dizendo que e a execução do aplicativo via JWS em si é uma loucura, o que considerei loucura é ter que expor a conexão via rede ao banco de dados diretamente à aplicação JWS.
Se eu estou com a aplicação JWS rodando desse jeito na minha máquina, e o protocolo de rede do PostreSQL for meio 'bobo", eu posso chegar via sniffer e descobrir:

  • o host onde está o banco de dados;
  • a porta onde o banco de dados está aceitando conexões;
  • o login e a senha usados para acessar o PostgreSQL.

Pior ainda, dependendo do caso, eu poderia usar um disassembler de bytecodes para tentar extrair essas informações aí em cima, se elas estiverem no arquivo jar a ser distribuído via JWS.

Imagine só o perigo que seria se as aplicações “bankline” da vida rodando nas máquinas dos clientes de diversos bancos conectassem direto nos bancos de dados das instituições financeiras…

O que muitos fazem hoje em dia é fornecer uma interface, normalmente em SOAP/WebService para fornecer algum tipo de informação/executar alguma operação.

Inté.[/quote]
Caro KWill,

Não vou entrar no mérito da segurança do acesso da aplicação aqui, pois não é relevante para a thread aqui aberta. Só para tranqüilizar a questão de segurança os módulos que deverão ser permitidos o acesso fora da rede local não colocam em risco o negócio da empresa, caso sejam interceptados.
Enfim voltando ao assunto principal, já coloquei mensagens de log nas classes e executei o aplicativo com o debugging e console do JWS habilitados fora da rede local para verificar onde se encontra a demora, o qual cheguei a classe de conexão com o banco, a qual implementa o padrão Singleton. Creio ser algo em torno do Eclipselink executado nestas condições.

Olavo Jr.

http://forums.sun.com/thread.jspa?threadID=5404318

Nessa thread, ele direciona para uma “solução”:

http://dev.eclipse.org/newslists/news.eclipse.rt.eclipselink/msg00933.html

[quote=thingol]http://forums.sun.com/thread.jspa?threadID=5404318

Nessa thread, ele direciona para uma “solução”:

http://dev.eclipse.org/newslists/news.eclipse.rt.eclipselink/msg00933.html[/quote]

Caro Thingo,

Obrigado por me relembrar destas duas threads, realmente o problema estava no Eclipselink sendo executado nestas condições. A descrição do problema assim como o acompanhamento do BUG estão no endereço https://bugs.eclipse.org/bugs/show_bug.cgi?id=287718.

Olavo Jr.