Dúvidas na utilização de DataSource

5 respostas
F

Olá,

Estou com problemas para acessar um banco de dados mysql instalado no meu pc através de uma DataSource. Estou seguindo o exemplo de um livro de JSP e já consegui fazer os exemplos anteriores se conectarem com a BD, só que quando fui tentar utilizar a tal DataSource apareceu o seguinte erro do Tomcat no console:

Error occurred org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class ‘’ for connect URL ‘null’

Acho que a minha jsp não está conseguindo encontrar o objeto DataSource através da JNDI. A jsp é a seguinte:

<%@page import="java.sql.*, javax.sql.*, javax.naming.*"%>
<html>
<head>
<title>Using a DataSource</title>
</head>
<body>
<h1>Using a DataSource</h1>
<%
    DataSource ds = null;
    Connection conn = null;
    ResultSet result = null;
    Statement stmt = null;
    ResultSetMetaData rsmd = null;
    try{
      Context context = new InitialContext();
      Context envCtx = (Context) context.lookup("java:comp/env");
      ds =  (DataSource)envCtx.lookup("jdbc/address");
      if (ds != null) {
        conn = ds.getConnection();
        stmt = conn.createStatement();
        result = stmt.executeQuery("SELECT * FROM AddressList");
       }
     }
     catch (SQLException e) {
        System.out.println("Error occurred " + e);
      }
      int columns=0;
      try {
        rsmd = result.getMetaData();
        columns = rsmd.getColumnCount();
      }
      catch (SQLException e) {
         System.out.println("Error occurred " + e);
      }
 %>
 <table width="90%" border="1">
   <tr>
   <% // write out the header cells containing the column labels
      try {
         for (int i=1; i<=columns; i++) {
              out.write("<th>" + rsmd.getColumnLabel(i) + "</th>");
         }
   %>
   </tr>
   <% // now write out one row for each entry in the database table
         while (result.next()) {
            out.write("<tr>");
            for (int i=1; i<=columns; i++) {
              out.write("<td>" + result.getString(i) + "</td>");
            }
            out.write("</tr>");
         }
 
         // close the connection, resultset, and the statement
         result.close();
         stmt.close();
         conn.close();
      } // end of the try block
      catch (SQLException e) {
         System.out.println("Error " + e);
      }
      // ensure everything is closed
    finally {
     try {
       if (stmt != null)
        stmt.close();
       }  catch (SQLException e) {}
       try {
        if (conn != null)
         conn.close();
        } catch (SQLException e) {}
    }
 
    %>
</table>
</body>
</html>

O web.xml da minha aplicaçao está desse jeito:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
	"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
	<resource-ref>
		<res-ref-name>jdbc/address</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
</web-app>

e eu acrescentei o seguinte elemento no arquivo server.xml do Tomcat
logo antes do elemento </host> de fechamento próximo do final do arquivo

&lt;!--O trexo abaixo configura o datasource para que os servlets possam se conectar com a base de dados--&gt;
	&lt;Context path="/chapter14" docBase="chapter14" debug="0" reloadable="true"&gt;
		&lt;ResourceParams name="jdbc/address"&gt;

			&lt;parameter&gt;
				&lt;name&gt;password&lt;/name&gt;
				&lt;value&gt;1234&lt;/value&gt;
			&lt;/parameter&gt;

			&lt;parameter&gt;
				&lt;name&gt;url&lt;/name&gt;
				&lt;value&gt;jdbc&#58;mysql&#58;//localhost&#58;3306/ADDRESS&lt;/value&gt;
			&lt;/parameter&gt;

			&lt;parameter&gt;
				&lt;name&gt;driverClassName&lt;/name&gt;
				&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;
			&lt;/parameter&gt;

			&lt;parameter&gt;
				&lt;name&gt;username&lt;/name&gt;
				&lt;value&gt;admin&lt;/value&gt;
			&lt;/parameter&gt;
		
		&lt;/ResourceParams&gt;
	&lt;/Context&gt;

      &lt;/Host&gt;

    &lt;/Engine&gt;

  &lt;/Service&gt;

&lt;/Server&gt;

O .jar do driver e os arquivos commons-dbcp.jar e commons-pool.jar já estão dentro da pasta de bibliotecas do tomcat. Sinceramente não entendo como essa estória de dataSource funciona, apesar de entender alguma coisa de JNDI.

Agradeço as respostas,

Fischer
[/code]

5 Respostas

F

Pessoal,

Ninguém aí que já tenha utilizado DataSource pode me dizer o que está acontecendo ou pelo menos me ensinar a configurar corretamente? Descobri aqui que a exceção está sendo lançada pelo método ds.getConnection().

Obrigado,

Fischer

F

UP!!! Ainda tenho esperanças de que alguém me ajude :grin: .

F

No server.xml, faltou a linha:

#Resource auth="Container" description="DB Connection" name="jdbc/address" type="javax.sql.DataSource"##

antes do ResourceParams

Primeiro vc tem que definir o Resource para depois especificar seus parametros.

Não esqueça de trocar o # por < e o ## por />.
Tive que fazer assim porque o fórum aparentemente ta parseando o conteudo e proibindo de postar essa tag… não sei se deu pra entender :wink:

F

Olá,

Descobri o problema: quando eu efetuava o deploy do web module no lomboz não era criada uma pasta dentro de $CATALINA_HOME\webapps e sim um arquivo .war e com isso aquele path definido no elemento Context do server.xml nunca era encontrado. Alguém poderia me responder duas perguntas?

  • Onde tenho que mexer para que ao invés de um arquivo .war seja criada uma pasta em webapps no deploy do módulo?

  • Posso configurar mais de um DataSource em um mesmo server.xml, um para cada base de dados?

Obrigado,

Fischer

F

sim, vc pode definir mais de um datasource no server.xml.
No tomcat 5.0.x, vc alternativamente pode definir todo o contexto de sua aplicaçao, inclusive os datasources em um arquivo que fica no diretorio $CATALINA_HOME/Catalina/localhost… o nome do arquivo é nome_da_aplicacao.xml.
Dessa forma o server.xml fica mais limpo. Porém, se vc quiser definir um datasource global, tem que ser no server.xml mesmo.

Criado 25 de fevereiro de 2005
Ultima resposta 4 de mar. de 2005
Respostas 5
Participantes 2