Erro na conexão com mysql (o q fazer?) (RESOLVIDO)

20 respostas
C

pessoal...

estou fazendo um programinha simples pra web (html+jsp+ .java)

*o cara digita o nome num input de html..
*esse nome vai para um atributo 'nome' em uma classe pessoaBean.java..
*em seguida, esse atributo nome da classe pessoaBean.java vai para uma tabela no mysql

pelo que vi na tela do tomcat, esta dando um erro na hora de conectar com o banco , ele entra no try e logo em seguida cai no catch

abaixo esta o método de conexao com o banco:

public Connection connReturn() {
		Connection conn = null;

		try {
			System.out.println("******entrou no Factory metodo Connection try");
			
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost/jsp",
					"root", "");
			System.out.println("conexao efetuada =)");

		} catch (Exception e) {
			System.out.println("******entrou no Factory metodo Connection catch");
			System.out.println("erro na conexao " + e.getMessage());
		}
		return conn;
	}

[color=red]
alguem consegue indentificar o que esta errado?
[/color]

(eu ja adicionei o jar do conector do mysql no projeto, estou conseguindo inserir dados na tabela atraves de uma classe de teste (que nao usa o html e jsp))

obrigado!!!!!!!! :D

20 Respostas

C
JOMI:
Pela tela de erro, o problema nao está na conexao e sim na inserção. De uma olhada em PessoaDB.inserir, tá dando nullPointer.

intaum.... a classe PessoaDB tem o metodo inserir:

public boolean inserir (pessoaBean pess){
		try{
			System.out.println("*** entrou no metodo INSERIR try");
			Connection conn = null;
			Factory f = new Factory();
			conn = f.connReturn();
			
			System.out.println("******************parte 2");
			PreparedStatement ps;
			ps = conn.prepareStatement("insert into tabnome (nome) values (?)");
			System.out.println("*******parte3");
			
			ps.setString(1,pess.getNome());
			ps.executeUpdate();
					
			System.out.println("inserido");
			conn.close();
			
			return true;
		}catch(Exception e){
			System.out.println(" ******* entrou no metodo INSERIR cat");
			e.printStackTrace();
			return false;
		}
		

	}

esse mesmo método esta inserindo dados na tabela via classe de teste!!
aparentemente tem algo errado??

C

JOMI:
Bom, olhando melhor a exception eu vi algo como
Communication link failure: Bad handshake

Isso é devido ao conector .jar que vc pegou…qual a versao do mysql?
veja o link abaixo

http://portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=8449

o conector que eu uso é esse:
mysql-connector-java-5.0.3-bin.jar

mas por eu conseguir inserir o dado na tabela atraves de uma classe de teste nao quer dizer que o conector esta certo??

R

Pelo erro parece estar realmente nesta linha

ps.setString(1,pess.getNome());

Esta dando null, verifique o valor que esta vindo( Eu normalmente ponho print pra ter certesa do que esta vindo, mas provavelmente deve estar null, verifique o método setNome(String var) da sua classe pessoaBean…

C

Romeo:
Pelo erro parece estar realmente nesta linha

ps.setString(1,pess.getNome());

Esta dando null, verifique o valor que esta vindo( Eu normalmente ponho print pra ter certesa do que esta vindo, mas provavelmente deve estar null, verifique o método setNome(String var) da sua classe pessoaBean…

fiz isso: puis um println getNome() la em cima da linha:
ps.setString(1,pess.getNome())

System.out.println("o nome vindo do Beans é:"+ pess.getNome());

resultado:
qnd eu insiro um nome na tabela via classe de teste , aparece td certo…
qnd tento inserir via formulario html, ele nao exibe o print (ele da erro antes dessa parte) eu acho que é a conexao…estou mandando uma foto da estrutura do meu programa, o conector esta no lugar certo?? (ou do jeito que esta, soh funciona como programa de desktop msm, em aplicações web ele deve ser adicionado de uma outra forma???)

  1. :wink: vlws

R

O problema ta na linha de codigo mesmo, olhando de novo ele não entra na mensagem “**********parte3”, então com certeza é nessa linha…

ps = conn.prepareStatement("insert into tabnome (nome) values (?)");

o PreparedStatement esta certo, então o erro é no conn

Vi que vc pega a conexão na classe Factory com o método connReturn(), verifique (imprimindo mesmo) o que esta retornando ( em formato String ).

Poe aqui o que esta retornando…

C

Romeo:
O problema ta na linha de codigo mesmo, olhando de novo ele não entra na mensagem “**********parte3”, então com certeza é nessa linha…

ps = conn.prepareStatement("insert into tabnome (nome) values (?)");

o PreparedStatement esta certo, então o erro é no conn

Vi que vc pega a conexão na classe Factory com o método connReturn(), verifique (imprimindo mesmo) o que esta retornando ( em formato String ).

Poe aqui o que esta retornando…

no meu método inserir , inclui uma linha pra mostrar o que retorna la da classe de conexao:

conn = f.connReturn(); System.out.println("o conn retorna:" + conn);
mas ele nao retorna, ele nao ‘completa’ a conexao acho0 que o erro esta nessas linhas:

Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost/jsp",
					"root", "");

em alguns tutoriais esse endereço (“com.mysql.jdbc.Driver” ) esta diferente : no tutorial esta assim:
Class.forName([color=red] “org.gjt.mm.mysql.Driver”[/color]);

o que faz essa linha?

vlws pelo help Romeo :wink:


R

em alguns tutoriais esse endereço (“com.mysql.jdbc.Driver” ) esta diferente : no tutorial esta assim:
Class.forName( “org.gjt.mm.mysql.Driver”);

o que faz essa linha?

Essa linha informa qual a classe do Driver e o carrega.

Quanto ao erro, esta realmente em uma destas linhas, vou postar os possíveis erros:

1 - O endereço da classe do driver esta errado, mas como o eclipse compilou deve estar certo…

2 - Os parametros passados para fazer a conexão podem estar errados
dbc:mysql://localhost/jsp",“root”, “”

lembrando que quando vc poe localhost ou localhost:3306 da no mesmo, pois essa é a porta padrão, verifique no mysql se é ela mesmo.

jsp tem que ser o nome da Table

O Mysql tem que ter um usuario “root” sem senha.

Para indentificar melhor o erro, ao invés de por uma Exception e no catch, use uma SQLException e

Obs: depois não precisa imprimir, use e.printStackTrace(); que ela ja imprime, e fala qual o erro detalhadamente

C

Romeo:
em alguns tutoriais esse endereço (“com.mysql.jdbc.Driver” ) esta diferente : no tutorial esta assim:
Class.forName( “org.gjt.mm.mysql.Driver”);

o que faz essa linha?

Essa linha informa qual a classe do Driver e o carrega.

Quanto ao erro, esta realmente em uma destas linhas, vou postar os possíveis erros:

1 - O endereço da classe do driver esta errado, mas como o eclipse compilou deve estar certo…

2 - Os parametros passados para fazer a conexão podem estar errados
dbc:mysql://localhost/jsp",“root”, “”

lembrando que quando vc poe localhost ou localhost:3306 da no mesmo, pois essa é a porta padrão, verifique no mysql se é ela mesmo.

jsp tem que ser o nome da Table

O Mysql tem que ter um usuario “root” sem senha.

Para indentificar melhor o erro, ao invés de por uma Exception e no catch, use uma SQLException e

Obs: depois não precisa imprimir, use e.printStackTrace(); que ela ja imprime, e fala qual o erro detalhadamente

aparentemente esta certo a linha de sql…!! (veja a imagem)…

vc disse:

la nao tem que ser o nome do DataBase???

(odeio esses erros q nao da pra descobrir!! =( )


R

Então, aparentemente em código esta tudo certo, o jeito é tentar uma outra coisa que me veio em mente…

Vc colocou o driver do mysql dentro da pasta EXT ou LIB certo?

Se sim, tente fazer deste outro jeito pois uma vez aconteceu o mesmo comigo.

Deixando ele desta forma de biblioteca não funcionava mas quando o coloquei como um jar externo funcionou, é só por o jar dentro da sua pasta do workspace e no gerenciador de classpatch adicionar “Add External Jar”, ai ele vai aparecer só como um vazinho, diferente do JRE, que tem um desenho diferente.

Abra o jar pelo package explorer e verifique se os nomes das pastas correspondem ao que vc colocou no código

Y

Se você colocou o JAR do driver dentro da pasta lib\ext, certifique-se de ter posto dentro da lib\ext da JRE, e não da JRE embutida do JDK.

Y

Li agora o código e vi os screens. O erro com certeza está na Connection.

Partindo da tua classe que usa a conexão. Primeiramente ela chama o Factory.connReturn(). Esse método exibe no prompt a mensagem de que está entrando no try, mas não exibe a mensagem de “Conexão efetuada”, isso pq ocorreu um erro, claro. O método é quase totalmente coberto por um try/catch, o que faz com que mesmo ocorrendo erro, a aplicação não deixe de executar. Então o catch do connReturn() imprime a mensagem de erro e continua executando. Ao chamar o método inserir(), ele vai executando normal, inclusive exibe a mensagem de que entrou no try do método. Entretanto, ele só imprime no prompt o texto “**********parte 2”, que é um código localizado numa linha imediatamente anterior à chamada do prepareStatement(), o que comprova que o problema está sendo um NullPointer no retorno do Factory.connReturn().

O que você tem de fazer é copiar exatamente essas linhas

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/jsp", "root", "");

em outra classe e testar se funciona.

C

intaum… eu só adicionei o jar externo indo em em ‘propriedades’ (como se faz para programas SE)…

(olhem a imagem anexada)…

[color=red]
Qual é a maneira correta de adicionar um conector mysql para aplicaçoes web??
[/color]

C

Yky Mattshawn:
Li agora o código e vi os screens. O erro com certeza está na Connection.

Partindo da tua classe que usa a conexão. Primeiramente ela chama o Factory.connReturn(). Esse método exibe no prompt a mensagem de que está entrando no try, mas não exibe a mensagem de “Conexão efetuada”, isso pq ocorreu um erro, claro. O método é quase totalmente coberto por um try/catch, o que faz com que mesmo ocorrendo erro, a aplicação não deixe de executar. Então o catch do connReturn() imprime a mensagem de erro e continua executando. Ao chamar o método inserir(), ele vai executando normal, inclusive exibe a mensagem de que entrou no try do método. Entretanto, ele só imprime no prompt o texto “**********parte 2”, que é um código localizado numa linha imediatamente anterior à chamada do prepareStatement(), o que comprova que o problema está sendo um NullPointer no retorno do Factory.connReturn().

O que você tem de fazer é copiar exatamente essas linhas

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/jsp", "root", "");

em outra classe e testar se funciona.

inseri as linhas q vc disse…
ainda nao deu olha o q aparece: (no anexo)

R

Então, o problema maior é o fato do erro não estar sendo imprimido, faça isso aqui em todos os catch

try{ /// } catch(SQLException e){ e.printStackTrace(); }

Acho que dessa maneira ele indica melhor qual o erro

Y

comedor_de_folhas, concordando com a hipótese do usuário acima, estou te passando uma classe bem simples, execute-a e então imprima aqui a nós o erro gerado.

C

Romeo

puis o SQLException e nos catch e apareceu essa pg de erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: com.mysql.jdbc.Driver
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:867)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:800)
	org.apache.jsp.inclui_jsp._jspService(inclui_jsp.java:105)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

root cause

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1383)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1230)
	java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
	java.lang.Class.forName0(Native Method)
	java.lang.Class.forName(Class.java:164)
	factory.Factory.connReturn(Factory.java:21)
	db.PessoaDB.inserir(PessoaDB.java:21)
	org.apache.jsp.inclui_jsp._jspService(inclui_jsp.java:75)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

note The full stack trace of the root cause is available in the Tomcat logs.

Yky Mattshawn
executei a classe q vc mandou e nao deo nenhum erro....
(veja a img)

e qnt a posiçao do meu conector, vcs viram a imagem q eu mandei de como ele esta ? (esta como aplicaçao SE sera q nao tem haver??)

Y

Cara, começo a desconfiar que o problema possa mesmo ser com o teu Driver.

Por via das dúvidas, tente rodar a classe que te passei pelo prompt, fora da IDE.

C

Yky Mattshawn:
Cara, começo a desconfiar que o problema possa mesmo ser com o teu Driver.

Por via das dúvidas, tente rodar a classe que te passei pelo prompt, fora da IDE.

[color=green]DEU CERTO!!! [/color]

o problema era o eclipse msm!! (ele estava importando o jar externo pra pasta raiz do programa (não é la que deve ficar))

joguei o conector na pasta lib (na mao…) (/projeto/web/WEB-INF/lib)
rodei tudo sem o eclipse e tentei inserir um nome via html d novo e deu certo!!!

puts finalmente!!

MUTO OBRIGADO :
[size=18]Yky Mattshawn
Romeo [/size]
sem vcs eu nunca ia achar esse erro!!!



J

Pela tela de erro, o problema nao está na conexao e sim na inserção.
De uma olhada em PessoaDB.inserir, tá dando nullPointer.

J

Bom, olhando melhor a exception eu vi algo como
Communication link failure: Bad handshake

Isso é devido ao conector .jar que vc pegou…qual a versao do mysql?
veja o link abaixo

http://portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=8449

Criado 23 de março de 2007
Ultima resposta 23 de mar. de 2007
Respostas 20
Participantes 4