Dúvida na Conexão com Oracle

Boa tarde amigos.
Tô com um ‘pobrema’:

Baixei o arquivo ‘classes12.zip’, que é o driver do Oracle para jdk1.3 e inferiores, coloquei o caminho para ele no classpath, mas ainda assim parece que não está funcionando.

Alguém pode dar uma luz?

Outra coisa que estranhei é que o arquivo tem extensão ‘ZIP’.

Não deveria ser ‘JAR’ ???

Tenta descompacta-lo. Talvez o jar esteja dentro dele.
Tudo que vc aponta no classpath deve ser jar, não zip

Poste o código da sua classe de conexão e qual o erro (stacktrace, please).

A Oracle tem um padrão horrivel de nome de arquivo para os seus drivers JDBC. Historicamente ela empacotava como .zip (.zip = .jar). Só recentemente ela passou a utilizar .jar para os drivers. Pode usar como .zip ou renomear para .jar.

Claro!
Vou renomear o zip para jar, para confunfir menos e porque eu prefiro o JAR, hehehe…
Posso colocar este JAR onde eu quiser, ou tem que ser dentro do diretório da minha JDK?

Meu código é o seguinte (conexão direto na página, não tô usando uma classe para conexão ainda):

<%@page language="java" import="java.io.*,java.sql.*,javax.sql.*,javax.naming.*" %>

<html>
<head>
<title>Conexão com oracle utilizando JDBC:thin </title>
</head>
<body>
<%
OracleDataSource ods;
Connection conexao = null;

try 
{
	ods = new OracleDataSource();
	ods.setURL("jdbc:oracle:thin:meuusuario/minhasenha@meuhost:1521");
	
	conexao = ods.getConnection();
	
	out.println("<H1>Tabela</H1>");
	out.println("<table border=1 cellpadding=4>");
	out.println("<tr><td><b>Id</b></td><td><b>Nome</b></td>" + "<td><b>Telefone</b><td></tr>");
	
	Statement stmt= conexao.createStatement();
	ResultSet rs = stmt.executeQuery("SELECT campo1,campo2,campo3,campo4 FROM tabela");

	while (rs.next()) 
	{
		out.println("<tr><td>"+rs.getString(1)+"</td>" +"<td>"+rs.getString(2)+"</td>" +"<td>"+rs.getString(3)+"</td></tr>");
	} 
		out.println("</table>");
		conexao.close();
} 
catch (SQLException sqle) 
{
	out.write("<= OCORREU EXCEPTION => <br> <br> <br>" + sqle);
	sqle.printStackTrace();
	out.write("<H3>Message: "+sqle.getMessage()+" </H3>");
	out.write("<H3>Error Code: "+sqle.getErrorCode()+" </H3>");
	out.write("<H3>SQLState: "+sqle.getSQLState()+" </H3>");
	sqle.printStackTrace();
} 
finally 
{
	try 
	{
		if (conexao != null) 
		conexao.close();
	} 
	catch (SQLException ignored) { }
		
	out.flush();
	out.close();
}
%>
</body>
</html>

Que dá o seguinte erro:


type Exception report

message

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

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 7 in the jsp file: /directConnect.jsp

Generated servlet error:
    [javac] Compiling 1 source file

D:\Luiz-Felipe\Java\Sfw-rsc\apache-tomcat-4.1.34\work\Standalone\localhost\test\directConnect_jsp.java:47: cannot resolve symbol
symbol  : class OracleDataSource 
location: class org.apache.jsp.directConnect_jsp
OracleDataSource ods;
^



An error occurred at line: 7 in the jsp file: /directConnect.jsp

Generated servlet error:
D:\Luiz-Felipe\Java\Sfw-rsc\apache-tomcat-4.1.34\work\Standalone\localhost\test\directConnect_jsp.java:52: cannot resolve symbol
symbol  : class OracleDataSource 
location: class org.apache.jsp.directConnect_jsp
	ods = new OracleDataSource();
                  ^
2 errors

Sugestões?
valeu!

Classpath

Na boa: esquece este negócio de codificar conexão em DB no JSP. Só vai te dar dor de cabeça. Vai ser muito mais produtivo criar um servlet para isto.

OracleDataSource ods;
Connection conexao = null;

try 
{
	ods = new OracleDataSource();
							ods.setURL("jdbc:oracle:thin:meuusuario/minhasenha@meuhost:1521");
	
	conexao = ods.getConnection();

Voce precisa usar DataSource? Se não for precisar, de uma lida neste tutorial

Agora se for precisar usar DataSource, não use a classe OracleDataSource
diretamente.

Oi. Bom, precisar acho que eu nao PRECISO usar não…usei porque estava no exemplo que eu peguei, rs.
Eu ja tinha feito isso antes, sem usar esse tal de OracleDataSource…

Outra coisa é que este tutorial é até legal, mas, apesar dele dizer que colocar a conexão na própria página é um pessimo hábito, é isso o que ele faz…rs…

Realmente eu prefiro fazer uma servlet com a conexão separada, usando jdbc, e depois imprimir os resultados. Sabe onde tem algum tuto sobre isso?

obrigado

O problema da maioria destes tutos é que eles exemplificam usando mysql como sendo o banco usado, e na hora de usar outro, no meu caso ORACLE, baba tudo…vamos lá. Seguí os seguintes passos, mas ainda assim não consigo conectar:

  1. Baixei o arquivo “classes12.zip”, que é o conector jdbc oracle para a jdk 1.3.
  2. Coloquei o caminho para este arquivo no classpath
  3. Copiei este arquivo para o diretório da jdk\jre\lib\ext
  4. Criei a seguinte página:
<%@page language="java" import="java.io.*,java.sql.*,javax.sql.*" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<title>Teste de Conexão</title>  
</head>  
<body>  
<%  
  Connection con;  
  Statement stm;    
  try 
  {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    con = DriverManager.getConnection("jdbc:oracle:thin:@hostbanco:1521:nomebanco","user","password");
    stm = con.createStatement();   
    out.println("Conexão efetuada com sucesso");  
  } 
  catch (Exception e) 
  {	  
    out.println("Não foi possível conectar ao banco. Exeção: " + e.getMessage());  
  }  
%>      
</body>  
</html> 

ele sempre cai na exceção, e não conecta.

Alguém pode ajudar???

Coloque o stacktrace da exception, senão vai ser dificil saber qual o problema.

Oi.

Fica nessa:

Não foi possível conectar ao banco. Exeção: oracle.jdbc.driver.OracleDriver

Quando coloco no classpath o caminho, tenho que colocar o caminho da jre (exemplo : minhajdk\jre\lib\ext\classes12.jar )

ou posso colocar qualquer caminho onde este arquivo se encontra?
(exemplo : felipe\java\classes12.jar )

[quote=Rage]O problema da maioria destes tutos é que eles exemplificam usando mysql como sendo o banco usado, e na hora de usar outro, no meu caso ORACLE, baba tudo…
[/quote]

O Pedrosa colocou o link da apostila pois tem uma seção que fala justamente sobre o problema do driver da oracle ser um arquivo .zip, vale a pena dar uma olhada…

Qual classpath? Imagino que na variável de ambiente.

Não faça isso… não faz sentido colocar jars no classpath global (explicação a seguir).

A exceção é o CLassNotFoundException. Não adianta colocar o seu .zip (ou .jar) em sua variável global pois o seu servlet conteiner (tomcat?) irá ignorá-lo em sua aplicação.

1-) Você deve colocar o seu zip no diretóri olib de sua aplicação web (WEB-INF/lib).

2-) Como disse, vale a pena dar uma olhada no exemplo da apostila, ele cita passo a passo o que fazer com o driver… seja um arquivo zip ou jar.
. Em aplicações WEB, o container não é obrigado a ler arquivos .zip, portanto renomeie seu arquivo para .jar.

Abraço

[quote]
Realmente eu prefiro fazer uma servlet com a conexão separada, usando jdbc, e depois imprimir os resultados. Sabe onde tem algum tuto sobre isso?[/quote]

mesmo link do pedrosa, capitulo de mvc.

[quote=bellijava]Tenta descompacta-lo. Talvez o jar esteja dentro dele.
Tudo que vc aponta no classpath deve ser jar, não zip[/quote]

O driver do oracle é um zip mesmo. Vale lembrar que o .jar é literalmente um .zip. Basicamente não tem nada a mais.

O java aceita o .zip sim, ele vai verificar que é um arquivo zip compactado, assim como ele faz com qualquer arquivo no classpath. O problema está em aplicações web (ou controladas por algum tipo de container, que isola a variável classpath global de sua aplicação).

:arrow: Você está usando o Tomcat? Como você está fazendo o deploy da aplicação?
:arrow: Quantas JDK/JRE você tem instalado nesta máquina? Qual JVM está sendo usada para rodar o Tomcat (ou o outro Servlet Container)?
:arrow: Por que você está usando JDK 1.3? Exigencia do projeto?
:arrow: Você sabe o que é stacktrace? Acho que não. Então mude o seu JSP e coloque e.printStackTrace().

[quote=oyama]
:arrow: Você sabe o que é stacktrace? Acho que não. Então mude o seu JSP e coloque e.printStackTrace().[/quote]

A exception que imprime o nome da classe como toString (getMessage) é o ClassNotFoundException.

[quote=Guilherme Silveira][quote=oyama]
:arrow: Você sabe o que é stacktrace? Acho que não. Então mude o seu JSP e coloque e.printStackTrace().[/quote]

A exception que imprime o nome da classe como toString (getMessage) é o ClassNotFoundException.[/quote]

Até dava para deduzir isto. Só queira ensinar o Rage como imprimir o stacktrace caso ocorra novos erros, pois dependendo, não vai dar para deduzir tão facilmente o erro.

[quote=oyama][quote=Guilherme Silveira][quote=oyama]
:arrow: Você sabe o que é stacktrace? Acho que não. Então mude o seu JSP e coloque e.printStackTrace().[/quote]

A exception que imprime o nome da classe como toString (getMessage) é o ClassNotFoundException.[/quote]

Até dava para deduzir isto. Só queira ensinar o Rage como imprimir o stacktrace caso ocorra novos erros, pois dependendo, não vai dar para deduzir tão facilmente o erro.[/quote]

O pior é o nullpointerexception não? “null”…
E o 1/0?
O pessoal economizou nas mensagens de erro…