Conexão com o banco de dados fechada

11 respostas
D

Olá a todos.

Só estou criando este tópico porque não consegui resolver o problema de conexão com o banco de dados.

Minha aplicação JSP insere tópicos, bom, inseria, pois quando estou tentando inserir outro, mostra uma mensagem de excessão e logo em seguida toda a comunicação com o banco de dados é perdida.

A mensagem é esta:
Não foi possível se conectar ao banco de dados!
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed

Estou realizando conexão com uma classe java que está bem aqui:
package schema;

import java.sql.*;

public class Conexao {
    
    static Connection conn = null;
    
 public Connection getConection() {
     
    if (conn == null) {
    try {
        String driver001 = "org.gjt.mm.mysql.Driver";
    
        String server001 = "localhost";
        String dbase001 = "banco";
        String user001 = "user";
        String pass001 = "pass";
    
        Class.forName(driver001);
        
        conn = DriverManager.getConnection("jdbc:mysql://" +server001+ "/" +dbase001 , user001 , pass001);
    
        //System.out.println("Conexão ao banco de dados "+dbase001+" estabelecida com sucesso!");

        //return conn;
        
       } catch(ClassNotFoundException cnfex) {
           //System.out.println("Driver não encontrado!");
           return null;
       } catch(SQLException sqlex) {
           //System.out.println("Não foi possível realizar a conexão com o banco de dados!\n"+sqlex);
       } catch(Exception ex) {
          // System.out.println("Erro inesperado!");
           return null;
       }
      } // fim do if
    
    return conn;
    
   } // fim do método "Connection"
 
   public static void main(String[] args) {
     Conexao c = new Conexao();
     conn = c.getConection();
 } 
}
e eu a imorto na página assim:
<%@page language="java" import="schema.Conexao"%>
<%@page import="java.sql.*"%>  

<%  

Connection conn = null;

  Conexao c = new Conexao();
    conn = c.getConection();


ResultSet rs = null;
Statement stmt = null;

  if(conn == null) {
  try {
    stmt = conn.createStatement();
    
    String sql = "SELECT...";
    
    rs = stmt.executeQuery(sql);
    
    rs.next();

%>
 

   ....

  } chatch...
}
}

No começo do desenvolvimento não acontecia isso.

Será que o problema é na classe Java?

Obrigado.

11 Respostas

makoto

lembre-se de fechar a conexão:

conn.close();
makoto

Ué, deletaram meu post??

O

Esquece ja vi que não é o que eu falei rsss :oops:

D

Sim eu fecho a conexão sim, mas não resolve.

E isso pode atrapalhar a comunicação com outra página?

makoto

Trabalhando com JDBC, fechar a conexão é passo fundamental, se não fizer vai dar erro com certeza na inserção de novos dados.

makoto

seria legal se vc abrisse uma conexão inserisse o tópico e fechasse a conexão e cada nova inserção a conexão será aberta e fechada. vc fez assim?

D

Sim eu fiz.

italo.vendrameto

Bom vamos por partes.

Pelo erro que você apontou lá no inicio do tópico, você já verificou se o seu DBServer está funcionando corretamente e aceitando conexões com esse usuário e senha, tudo bem que antes funcionava mais vale apena fazer um teste para garantir que erro está realmente na sua aplicação.

Nesse seu bloco de código o IF tem que ser conn != null senão você vai receber um NullPointer
<%    
   Connection conn = null;  
   Conexao c = new Conexao();  
   conn = c.getConection();  

   ResultSet rs = null;  
   Statement stmt = null;  

   if(conn == null) {  
...
   }

Sobre a sua classe Conexao e a questão de abrir e fechar a Connetion
Na sua classe Conexao o atributo conn como static pode gerar um erro em um ambiente com concorrenência, por ser static esse atributo é comum a todas as instâncias da Classe conexao então se você tiver 3 instâncias de conexao sendo usadas e uma dele fechar a connection ferrou...

Você poderia tornar o método getConnection static e criar o conn dentro dele dessa forma seria cria uma conn usada e encerrada, mas como já foi comentado a mesma deve ser fechada senão não DB que aguente.

package schema;  

import java.sql.*;  

public class Conexao {  

public static Connection getConection() {  
   Connection conn = null;  
   try {  
      String driver001 = "org.gjt.mm.mysql.Driver";  

      String server001 = "localhost";  
      String dbase001 = "banco";  
      String user001 = "user";  
      String pass001 = "pass";  

      Class.forName(driver001);  

      conn = DriverManager.getConnection("jdbc:mysql://" +server001+ "/" +dbase001 , user001 , pass001);  
   } catch(ClassNotFoundException cnfex) {  
   } catch(SQLException sqlex) {  
   } catch(Exception ex) {  
   }  
   return conn;  
} // fim do método "Connection"  
}

Detalhe lembre de tratar as exception desses catch's

D
italo.vendrameto:
Bom vamos por partes.

Pelo erro que você apontou lá no inicio do tópico, você já verificou se o seu DBServer está funcionando corretamente e aceitando conexões com esse usuário e senha, tudo bem que antes funcionava mais vale apena fazer um teste para garantir que erro está realmente na sua aplicação.


Também pensei que fosse isso mas está sim, pois o texto é inserido corretamente.

Nesse seu bloco de código o IF tem que ser conn != null senão você vai receber um NullPointer
Também pensei que fosse isso, mas observe melhor: como vou realizar um select num testte para a variável conn como não nula, sendo que ela inicializa nula? (Se eu fizer assim, a página fica em branco, pois nenhum dado é mostrado).
Sobre a sua classe Conexao e a questão de abrir e fechar a Connetion Na sua classe Conexao o atributo conn como static pode gerar um erro em um ambiente com concorrenência, por ser static esse atributo é comum a todas as instâncias da Classe conexao então se você tiver 3 instâncias de conexao sendo usadas e uma dele fechar a connection ferrou...

Você poderia tornar o método getConnection static e criar o conn dentro dele dessa forma seria cria uma conn usada e encerrada, mas como já foi comentado a mesma deve ser fechada senão não DB que aguente.

Muito obrigado, acho que era isso mesmo. Bem que eu perguntei acima se era a classe java, hehe.
Obrigado mesmo. ^^

package schema;  

import java.sql.*;  

public class Conexao {  

public static Connection getConection() {  
   Connection conn = null;  
   try {  
      String driver001 = "org.gjt.mm.mysql.Driver";  

      String server001 = "localhost";  
      String dbase001 = "banco";  
      String user001 = "user";  
      String pass001 = "pass";  

      Class.forName(driver001);  

      conn = DriverManager.getConnection("jdbc:mysql://" +server001+ "/" +dbase001 , user001 , pass001);  
   } catch(ClassNotFoundException cnfex) {  
   } catch(SQLException sqlex) {  
   } catch(Exception ex) {  
   }  
   return conn;  
} // fim do método "Connection"  
}

Detalhe lembre de tratar as exception desses catch's

Como posso tratar essas excessões para mostrar na página JSP, sendo que o System.out.println da classe JAVA não executa em JSP. E não quero criar sessões redirecionando informações para a página anterior porque uma das versões do Firefox possui bug em relação a isso, levando o usuário a apertar o refresh do navegador para carregar a página novamente e executar esta tarefa de mostrar a mensagem da sessão. É um horror isso...

Bom, agora só tem um problema maior: é que a coluna de preenchimento com o texto é do tipo TEXT, o que não sei se deveria utilizar, pois está inserindo caracteres estranhos nesta coluna.

Como mostram as imagens:

[img]http://i70.servimg.com/u/f70/11/80/81/44/dados10.gif[/img]

E aqui os tipos de variáveis:

[img]http://i70.servimg.com/u/f70/11/80/81/44/dados010.gif[/img]

Daí quando tento executar um SELECT com os dados estranhos, a coluna fica sem conteúdo.

Acho que é o tipo de variável mesmo, mas não tenho certeza.

D

EH, descobri onde estava o problema

bom, então se isso aconteceu somente após cadastrar os dados, deve ter sido aqui o problema:

<%@page contentType="text/html;charset=ISO-8859-1"%>
<%@page language="java" import="schema.Conexao"%>
<%@page import="java.sql.*"%>
<% 
   // session.getAttribute("adm001");

    String titleEvento = request.getParameter("titleTopic");
    String conteudoEvento = request.getParameter("conteudoTopic");
    
   
    if(titleEvento == null) {
        response.sendRedirect("new-evento.jsp");
        } else {
    
    Conexao c = new Conexao();  
   
   Connection conn = null; 
    conn = c.getConection();
   
   Statement stmt = null;
   
   try {  
        stmt = conn.createStatement();
       
        stmt.execute("INSERT INTO tableTopic (titleTopic, conteudoTopic) VALUES ('"+
                titleEvento+"', '"+conteudoEvento+"');");// WHERE adm001 == '"+adm001+"');"); 

        response.sendRedirect("./eventos.jsp");
        
       // out.println("Evento criado com sucesso!");
        
        stmt.close(); 
        conn.close();
        
      } catch( SQLException sqlex) {
         out.println("Não foi possível criar o evento<br>" +sqlex);
      }         
  }                            
   
  %>

o stmt.close() e conn.close() estavam após redirecionar a página, puxa, como pude cometer este erro. =/

Após eu consertar o que fiz, adicionando estes fins de conexão e Statement antes de redirecionar a página, deu certo, sem problemas de conexão fechada. =]

Bom, vou verificar se isso não ocorre novamente e posto os resultados.

Obrigado a todos pela ajuda.

Vocês foram fundamentais para meu melhor desenvolvimento e fico muito grato por isso. =]

D

EH, parece que os caracteres estranhos ainda continuam no fim de todo o texto cadastrado.

E não é por causa da codificação da página de envio e da página que recebe os dados não, pois estas já foram modificadas para inúmeras codificações.

Estou utilizando um editor parecido com este da GUJ, claro que o meu é bem mais simples, mas quebra o galho.

Existe alguma forma de retirar os caracteres estranhos?

Estou utilizando scripts para receber o texto do editor e depois repassar para a url de envio.

Segue ae:
<form name="RTEDemo" action="create.jsp"  method="post" onsubmit="return validaForm(this);">
   <div class="postdate" style="border-right:5px solid #000;">22
     <div class="month">OCT</div></div>
      <table>
          <tr>
              <td>
                  <table border="0">
          <tr>
              <td>
                  <b style="font-size:16px;">Título:</b> <input type="text" name="titleTopic" size="40" maxlength="40">&nbsp;
              </td>
             <td><a href="#" onclick="return hs.htmlExpand(this, { contentId: 'diretorioImagens' } )">
                 <b>Escolher imagens</b></a>
                 <br><i>(para copiar o endereço da imagem, clique com o botão<br>
                         direito do mouse em "propriedades" e copie o "endereço")</i>
                 </td>
          </tr>
      </table>
         
      <table border="0">
        <tr>
          <td>
<script language="JavaScript" type="text/javascript">
<!--
 function submitForm() {
	//make sure hidden and iframe values are in sync for all rtes before submitting form
        
          updateRTEs();
          alert("Seu texto é:\n" + (document.RTEDemo.rte1.value));
          //location.href="create.jsp?titleTopic="+frm.titleTopic.value+"&rte1="+rte1.value;
          window.open("create.jsp?titleTopic="+frm.titleTopic.value+"&rte1="+rte1.html.value);

     return true;
} 

//Usage: initRTE(imagesPath, includesPath, cssFile, genXHTML, encHTML)
initRTE("black/scripts/cbrte/images/", "black/scripts/cbrte/", "", true);
//-->
</script>
<noscript><p><b>Para visualizar este aplicativo, habilite o JavaScript de seu navegador.</b></p></noscript>
<script language="JavaScript" type="text/javascript">
<!--
//build new richTextEditor

var rte1 = new richTextEditor('rte1');
rte1.html = ''; 

//enable all commands for demo
rte1.cmdFormatBlock = true;
rte1.cmdFontName = true;
rte1.cmdFontSize = true;
rte1.cmdIncreaseFontSize = true;
rte1.cmdDecreaseFontSize = true;

rte1.cmdBold = true;
rte1.cmdItalic = true;
rte1.cmdUnderline = true;
rte1.cmdStrikethrough = true;
rte1.cmdSuperscript = true;
rte1.cmdSubscript = true;

rte1.cmdJustifyLeft = true;
rte1.cmdJustifyCenter = true;
rte1.cmdJustifyRight = true;
rte1.cmdJustifyFull = true;

rte1.cmdInsertHorizontalRule = true;
rte1.cmdInsertOrderedList = true;
rte1.cmdInsertUnorderedList = true;

rte1.cmdOutdent = true;
rte1.cmdIndent = true;
rte1.cmdForeColor = true;
rte1.cmdHiliteColor = true;
rte1.cmdInsertLink = true;
rte1.cmdInsertImage = true;
rte1.cmdInsertSpecialChars = true;
rte1.cmdInsertTable = true;
rte1.cmdSpellcheck = true;

rte1.cmdCut = true;
rte1.cmdCopy = true;
rte1.cmdPaste = true;
rte1.cmdUndo = true;
rte1.cmdRedo = true;
rte1.cmdRemoveFormat = true;
rte1.cmdUnlink = true;

rte1.toggleSrc = true;

rte1.build();
//-->
</script>
</td>
</tr>

<tr>
    <td>Clique em "publicar" para finalisar</td>
</tr>
<tr>
    <td><input type="submit" value="Publicar" /></td>
</tr>
</table>
</td></tr></table>
</form>
<!-- END Demo Code -->

Após clicar em "submit", o script, que eu não postei (esqueci) vai verificar se o título foi preenchido corretamente, se foi então redireciona para o outro script que é function submitForm() para concluir a operação.

Criado 4 de dezembro de 2008
Ultima resposta 4 de dez. de 2008
Respostas 11
Participantes 4