Olá galera! estou construindo uma aplicação que acessa um banco de dados[b] remotamente /b. Criei um pool de conexões e pego a conexão quando preciso como por exemplo cadastrar os clientes.
Porém estou achando a inserção de dados muito devagar, quando estava trabalhando com um banco local era muito rápido. Minha dúvida é se quando eu chamo a conexão ela não esta sendo criada novamente e seria esse a causa da demora Agradeço a Ajuda.
Abaixo segue a forma que estruturei o sistema:
1-ConectarBD: esta classe possui um construtor que faz a conexão, é criada assim que o sistema inicia, a partir dai a conexão está estabelecida.
2-InseriClientes: esta classe extende a ConectarBD(extender a classe ela cria novamente outra conexão?) com ela eu pego o metodo do ConectarBD pra criar um Statement e executar a inserção.
Qual será o motivo da lentidão do meu sistema? quanto tempo normalmente uma aplicação remota demora pra realizar uma inserção?
É bom pôr uns logs no seu sistema. Basta pôr um log só, que é onde você efetivamente abre a conexão.
Muita gente tem o costume de depender excessivamente da IDE para depurar programas, isso diz que seu programa funciona direitinho na hora de executar um teste, mas não é bom para determinar problemas de desempenho, como é o que você está enfrentando agora.
Sem querer ser chato, porque é que você fez uma classe de pool de conexões? Pode usar uma pronta, tal como a DBCP ( http://jakarta.apache.org/commons/dbcp/ ).
Many Jakarta projects support interaction with a relational database. Creating a new connection for each user can be time consuming (often requiring multiple seconds of clock time), in order to perform a database transaction that might take milliseconds. Opening a connection per user can be unfeasible in a publicly-hosted Internet application where the number of simultaneous users can be very large. Accordingly, developers often wish to share a “pool” of open connections between all of the application’s current users. The number of users actually performing a request at any given time is usually a very small percentage of the total number of active users, and during request processing is the only time that a database connection is required. The application itself logs into the DBMS, and handles any user account issues internally.
Veleu cara pela dica! nunca usei o dbcp, mas vou dar uma olhada! no caso uma conexão usando o dbcp meloraria o desempenho do meu sistema?
thingol
Estava olhando o dbcp, mas não faço idéia de como utiliza-lo e principalmente se eu vou realizar muitas mudanças já que o meu sistema está pronto(apenas com o problema da lentidão) você teria algum exemplo prático do dbcp?
Como as coisas estão prontas, é melhor você pôr o log, para ver se não está sendo aberta uma conexão para cada solicitação.
Normalmente o que se faz é o seguinte:
- Quando você quer abrir uma conexão, deve-se emprestá-la do pool, abrindo-a se necessário;
- Quando você quer fechar uma conexão, deve-se devolvê-la ao pool, que se encarregará de fechá-la se necessário (por exemplo, se ela já estiver muito tempo aberta);
- Pode ser que o seu “pool” esteja com algum probleminha de implementação, do tipo “estar fechando e abrindo conexões sempre”, em vez de “quando necessário”. Ponha o log (pode ser até um System.out.println) e veja o que está acontecendo.
Resolvi o problema! Valeu! o log mostrou que toda vez que eu ia inserir um cliente ele abria outra conexão. Retirei o extends da classe InserirCliente que extendia para o pool ConectarBD, criei uma interface para o meu pool, depois criei um objeto da Interface do pool dentro do InserirCliente, com ela eu pego a conexao sempre que desejar e o meu sistema está bem rápido.
Obrigado pela ajuda.