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

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:

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

[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!!! :smiley:

[quote=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.
[/quote]

intaum… a classe PessoaDB tem o metodo inserir:

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

}[/code]

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

[quote=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[/quote]

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??

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…

[quote=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…[/quote]

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

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…

[quote=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…[/quote]

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:


[quote] 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? [/quote]

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

[quote=Romeo][quote] 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? [/quote]

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

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!! =( )


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

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.

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.

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]

[quote=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.[/quote]

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

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

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.

Romeo

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

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

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??)


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.

[quote=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.[/quote]

[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!!!



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