Prezados,
Estou fazendo um sistema com servlets e jsp. O sistema começa com uma tela de login e senha, para que o usuário possa entrar a primeira vez eu fiz no banco uma conta de superusuario para um usuário local.
A primeira vez que você loga com o usuario interno (administrador), funciona certinho. Mas quando você clica em logout (fecha a sessão e deleta o cookie), e volta para a tela de login não consegue mas fazer login. Da essa exceção(no final do post coloco).
Se eu reiniciar o tomcat 6.0, funciona uma vez denovo. Ou seja, só funciona a primeira vez que o servidor abre, depois não funciona mais com nenhum usuário, nem o primeiro que eu criei nem outro que eu crie.
segue o código da consulta para fazer o login:
public Usuario getUsuario(String nome) throws Exception{
try{
Usuario usuario = null;
con = Conexao.getConexao(this.nome,senha);
st = con.createStatement();
rs = st.executeQuery("select * from usuario where nome='"+nome+"'");
rs.next();
usuario = new Usuario();
usuario.setId(rs.getInt("id"));
usuario.setNome(rs.getString("nome"));
usuario.setSenha(rs.getString("senha"));
usuario.setPermissao(rs.getString("permissao"));
return usuario;
}//fim do try
catch(SQLException e){
e.printStackTrace();
return null;
}//fim catch
finally{
rs.close();
st.close();
con.close();
System.out.print("Conexão fechada");
}//fim do finally
}//fim getUsuario
A primeira vez passa tranquilo, depois da primeira à exceção na linha:
rs = st.executeQuery(“select * from usuario where nome=’”+nome+"’");//quando executa a query.
Qualquer ajuda é bem vinda.
Grato!
Segue a exceção:
fechadainicioadministradorfimorg.postgresql.util.PSQLException: Um erro de E/S ocorreu ao enviar para o processo servidor.
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:219)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:337)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:236)
at login.DaoUsuario.getUsuario(DaoUsuario.java:51)
at login.ControleLogin.doGet(ControleLogin.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Stream closed
Prezados,
Consegui resolver o problema simplismente não dando close na conexão depois de fazer as transações.
Dai lembrei que minha professora também nunca dava close no connection.
Tem algum problema não dar close no connection?
O fato de não dar close no connection não faz meu programa ficar vulnerável?
bem, se vc não fechar a conexao, sua máquiba vai ficar sEMPRE, com a conexão aberta,o que vai sobrecarregar a memória.
o melhor é: apos cada consulta, fechar a conexçao.
nova consulta: reabre, consualta, fecha e depois maniupla o resultado.
Pois é, existe uma “política” (digamos assim) para a conexões ao banco em aplicativos web que sugere vc abrir uma conexão POR REQUEST, e não por COMANDOS SQL.
Uma outra opção mais simples é o uso de DATASOURCES. E como vc configura quase tudo no ambiente, pouca coisa vc alteria no código em si.
O container ficaria encarregado de abrir e fechar as conexções para vc. Ele monta o famoso pool de conexões e te oferta um java.sql.Connection viável sempre que vc requisitar.
Bom, eu nunca usei Datasources pra valer, não tenho certeza pra te confirmar isso.
Mas, se não me engano, quando vc manda fechar a conexão na verdade vc tá solicitando ao container para fechá-lo quando convir.
É melhor vc dar uma olhada direito, posso está falando besteira, hehe
[quote=fre_d]
já pensou se o usuário digitar o nome dele assim:
'; delete from usuario where nome not like '[/quote]
É só usar prepared statement, e evitar o injection.
Para a conexão não ficar pesando na memoria no seu metodo estatico getConexão da classe Conexão vc pode usar um singleton (Padrão de projeto onde so retorna uma instancia.)
Mais ou menos assim o
public class Conexao{
private Connection con = null;
public static Connection getConnection(){
if(con == null){
//Aqui vc faz uma nova conexão
}
return con;
}
public static void closeConnection(){
con.close();
con = null;
}
}
Assim vc pode fechar e abrir a conexão de qualquer Servlet/JSP.
[quote=Felagund][quote=fre_d]
já pensou se o usuário digitar o nome dele assim:
'; delete from usuario where nome not like '[/quote]
É só usar prepared statement, e evitar o injection.
Para a conexão não ficar pesando na memoria no seu metodo estatico getConexão da classe Conexão vc pode usar um singleton (Padrão de projeto onde so retorna uma instancia.)
Mais ou menos assim o
public class Conexao{
private Connection con = null;
public static Connection getConnection(){
if(con == null){
//Aqui vc faz uma nova conexão
}
return con;
}
public static void closeConnection(){
con.close();
con = null;
}
}
Assim vc pode fechar e abrir a conexão de qualquer Servlet/JSP.[/quote]
Pois é, mas mesmo assim cuidado com a hora de fechar a conexão.
Fala gente boa.
uchoaaa: Estive conversando com um professor meu e ele me disse exatamente isso: que se eu fechar a conexão eu estou mandando o container fechá-la, assim eu teria que reiniciar o tomcat pra poder abrir outra conexão.
fre_d: Não saquei! Se ele digitar isso, como você faz a verificação de coneção cada vez que entra. Ele não vai logar, muito menos executar o statement. No meu caso eu consulto o usuário que tenta logar e retorna do banco se não bater senha e login não sai da tela de login. Recebendo erro.
Felagund: Grande eu estou tentando fazer assim mesmo, como você falou.
public static Connection getConexao(String nome, String senha) throws Exception {
if(conexao == null){
Class.forName("org.postgresql.Driver").newInstance();
conexao = DriverManager.getConnection("jdbc:postgresql:escola",nome,senha);
}//fim do if
return conexao;
}//fim do método getConexao
Mas quando eu fecho a conexão, não consigo criar outra se não reiniar o tomcat 6.0.
Então to fazendo dessa forma mas devolvendo um statement e não connection.
package conexao;
import java.sql.*;
public class Conexao {
public static Connection conexao = null;
private static Statement statement;
public static Statement getConexao(String nome, String senha) throws Exception {
if(conexao == null){
Class.forName("org.postgresql.Driver").newInstance();
conexao = DriverManager.getConnection("jdbc:postgresql:escola",nome,senha);
}//fim do if
statement = conexao.createStatement();
return statement;
}//fim do método getConexao
}//fim da classe
Sim, sim… Faz sentido, não?!
Quando vc fecha sua conexão, ela não fica nula, fica apenas fechada(!). Ou seja, quando vc chamar getConnection() depois de um close() o seu IF aí nunca vai ser true.
O que vc pode fazer é verificar ser além de nula sua conexão está fechada. Mas daí daria quase na mesma: se fechar a conexao toda vez que executar um comando SQL vc vai ter uma instância para cara próxima chamada de getConexao()…
Ah, outra coisa, seu problema não é com login, é com a conexão com o banco…
:shock: :shock: :shock:
Cara! Desculpe a todos pelo tempo.
E muito obrigado.
Porra como eu não me liguei nisso. Fiz e nem percebi.
Sem palavras, valeu pessoal.
[quote=leohunther] :shock: :shock: :shock:
Cara! Desculpe a todos pelo tempo.
E muito obrigado.
Porra como eu não me liguei nisso. Fiz e nem percebi.
Sem palavras, valeu pessoal.[/quote]
Cara, se achas que resolvestes, explica aqui como e marca o título do post como resolvido…
Podes ajudar outros com dúvidas semelhantes.
Estive conversando com um professor meu e ele me disse exatamente isso: que se eu fechar a conexão eu estou mandando o container fechá-la, assim eu teria que reiniciar o tomcat pra poder abrir outra conexão.
[/quote]
Isso ta errado. Da sim para fechar e abrir a conexão.
Meu problema era mesmo no “conection == null”.
Conexão fechada não é igual a conexão null. Então o código nunca voltava uma conexão.