Conexão com o banco de dados fechada

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();
 } 
}[/code]


e eu a imorto na página assim:
[code]<%@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.

lembre-se de fechar a conexão:

conn.close();

Ué, deletaram meu post??

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

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

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

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

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?

Sim eu fiz.

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

[code]<%
Connection conn = null;
Conexao c = new Conexao();
conn = c.getConection();

ResultSet rs = null;
Statement stmt = null;

if(conn == null) {

}[/code]

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.

[code]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”
}[/code]

Detalhe lembre de tratar as exception desses catch’s

[quote=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.[/quote]
Também pensei que fosse isso mas está sim, pois o texto é inserido corretamente.

[quote]
Nesse seu bloco de código o IF tem que ser conn != null senão você vai receber um NullPointer[/quote]
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).

[quote]
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.
[/quote]Muito obrigado, acho que era isso mesmo. Bem que eu perguntei acima se era a classe java, hehe.
Obrigado mesmo. ^^

[quote][code]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”
}[/code]

Detalhe lembre de tratar as exception desses catch’s[/quote]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:

E aqui os tipos de variáveis:

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.

EH, descobri onde estava o problema

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

[code]<%@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);
  }         

}

%>[/code]

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. =]

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:

[code]

22
OCT
Título:   Escolher imagens
(para copiar o endereço da imagem, clique com o botão
direito do mouse em "propriedades" e copie o "endereço")
  <table border="0">
    <tr>
      <td>

Para visualizar este aplicativo, habilite o JavaScript de seu navegador.

Clique em "publicar" para finalisar
[/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.