Problemas no Tomcat (Pool de Conexoes)

28 respostas
P

Ae, galera,

To com um problema, aqui no tomcat relacionado a pool de conexoes, usando jndi, o que pude observer que aquela parte administrativa do tomcat e meio bugada, serio mesmo, eu adiciono la um datasource, com a url do postgres, o usuario e senha, e tudo mais, pega os jar necessarios para rodar a aplicacao, pool e o dhcp, do commons do projeto apache coloco no diretorio commons/lib do tomcat e nada, e o postgresql.jar .

porque nao funciona? adicionar um datastore pela parte administrativa do tomcat?

alguem saca?

28 Respostas

Luca

Olá

Não consegui entender o texto da sua mensagem e nem mesmo saber qual o problema. E o que é datastore?

[]s
Luca

Rafael_Steil

O que seria “nao funcionar”? da alguma mensagem de erro?

Rafael

P

da este problema aqui:

org.apache.jasper.JasperException: org.apache.tomcat.dbcp.dbcp.BasicDataSource

P

Get Connection Failed! Cannot create JDBC driver of class ‘’ for connect URL ‘null’

da esse erro!

Luca

Olá

Continuo sem saber o que você fez, como você fez, porque você acha bugado (qual o bug?) e o que significa o tal de datastore.

Dê uma mínima chance a alguém que saiba ajuda-lo e até agora nem um mago conseguiria isto.

[]s
Luca

P

Tudo bom luca,

problema meu e o seguinte,

Estou querendo configurar um pool de conexoes, no tomcat, certo utilizando o driver do postgresql.jar.
Vamos, la, DataStore e um meio que voce, tem de configurar um pool de conexoes, no tomcat, se voce entrar na parte administrativa do tomcat, voce vai ver, data sources, la tem um jndi, que voce configura. So que o seguinte, voce tem dois meios penso eu de configurar um e editando o arquivo server.xml e o web.xml dentro da pasta conf do tomcat, ou adicionando um jndi pela parte de administracao do tomcat, so que na administracao do tomcat eu adicionei e nao funciou, comeceu a lancar essas excecoes que eu colei nos posts anteriores, porque que nao funciona? sendo que eu peguei os jar necessarios para rodar um pool de conexoes, no tomcat, sao dois jar, dbcp e o pool e o driver do sgbd(postgres) que coloquei dentro do lib, dentro da pasta do conteiner, agora voce entendeu?

fcanjos

Olá,

Você configurou o seu contexto com o Use Naming = true?

Até mais!

Luca

Olá

Ainda não entendi exatamente o que vc fez pq vc disse mas não mostrou e muitas coisas podem estar erradas. Para não ficar aqui especulando vou ressaltar que vc precisa configurar tanto no server.xml como no web.xml (não são 2 meios). Siga exatamente como os exemplos da documentação que deve dar certo.

Uma outra alternativa é usar BeanFactory.

[]s
Luca

P

Coloquei isso no server.xml

antes do fechamento da tag </hosts>

&lt;Context path="" reloadable="true" docBase="" debug="0"&gt;              
        &lt;Resource name="jdbc/postgres" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
                username = ".."
                password = ".." 
                driverClassName = "org.postgresql.Driver" 
                url = "jdbc:postgresql://localhost:5432/xxxx"
                maxWait="1000" removeAbandoned="true"
                maxActive="100" maxIdle="30"
                removeAbandonedTimeout="60" logAbandoned="true"/&gt;        
     &lt;/Context&gt;

sendo que os jar ja estao dentro do container, na pasta lib correto? agora eu preciso especificar no web-xml da aplicacao que eu to rodando ou no web.xml que esta situando dentro da pasta conf do tomcat?

&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4"&gt;
&lt;web-app&gt;
  &lt;description&gt;Postgres Connection Pooling Test&lt;/description&gt;
  &lt;resource-ref&gt;
      &lt;description&gt;DB Connection&lt;/description&gt;
      &lt;res-ref-name&gt;jdbc/postgres&lt;/res-ref-name&gt;
      &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
      &lt;res-auth&gt;Container&lt;/res-auth&gt;
  &lt;/resource-ref&gt;
&lt;/web-app&gt;

nao esta tudo certo? ou eu preciso configurar algo a mais?

e para conectar eu nao faco isso daki?

Connection conn = null;
     try {
            Context initCtx = new InitialContext();
            DataSource ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/postgres");
            // ou
            // Context envContext = (Context)initCtx.lookup("java:comp/env");
            // DataSource ds = (DataSource) envContext.lookup("jdbc/postgres");
            try {
                conn = ds.getConnection();
            } catch (SQLException e1) {
                System.out.println("ERRO: Nao conseguiu conectar");
            }
        } catch (NamingException e) {
            System.out.println("Falha ao conectar");
        }
}

So que mesmo assim ta dando aqueles erros,

agora, para que existe, na parte administrativa, do tomca o data source, usando jndi, sendo que nao funciona, alguem ja fez dos dois modos e funcionou ?? O que eu estou fazendo de errado?

P

o que ta errado? a versao do tomcat e a 5.5.7

Luca

Olá

O jar do driver vc colocou em $CATALINA_HOME/common/lib? ou no lib dentro de WEB-INF?

Tente usar BeanFactory. Crie um Bean com os getters e setters das propriedades que deseja ler. No meu exemplo chamei de DataSourceBean. Coloque em algum lugar inicial (exemplo: contextInitialized(ServletContextEvent event) de um ContextListener) um trecho mais ou menos assim:
. . . 
DataSourceBean bean = null;
	  
	    try {
	    	Context initCtx = new InitialContext();
	        Context envCtx = (Context) initCtx.lookup("java:comp/env");
	        bean = (DataSourceBean) envCtx.lookup("bean/DataSourceBeanFactory");
	    
	    } catch (Exception e) {
	    	Log.error(e);
	        e.printStackTrace();
	    }
. . .
No server.xml coloque um trecho mais ou menos assim:
. . .
	&lt;Context path="/seu_contexto" 
		docBase="d:\yyy\xxx" 
		workDir="d:\yyy\work" 
		reloadable="true" 
		useNaming="true"
		debug="5"&gt;

	&lt;Resource name="bean/DataSourceBeanFactory" 
		auth="Container"
		type="seupacote.DataSourceBean"
		description="DataSource qq nome"
	/&gt;

            &lt;ResourceParams name="bean/DataSourceBeanFactory"&gt;
               &lt;parameter&gt;
		  &lt;name&gt;factory&lt;/name&gt; 
		  &lt;value&gt;org.apache.naming.factory.BeanFactory&lt;/value&gt;
	       &lt;/parameter&gt;

             &lt;parameter&gt;
                &lt;name&gt;driverClass&lt;/name&gt;
                &lt;value&gt;qqDriver&lt;/value&gt;
              &lt;/parameter&gt;

              &lt;parameter&gt;
                &lt;name&gt;user&lt;/name&gt;
                &lt;value&gt;xxxx&lt;/value&gt;
              &lt;/parameter&gt;

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

              &lt;parameter&gt;
                &lt;name&gt;URL&lt;/name&gt;
                &lt;value&gt;jdbc:urldodriver:@192.168.x.yyy:zzzz:wwwwww&lt;/value&gt;
              &lt;/parameter&gt;

              &lt;parameter&gt;
                &lt;name&gt;maxPoolSize&lt;/name&gt;
                &lt;value&gt;15&lt;/value&gt;
              &lt;/parameter&gt;

              &lt;parameter&gt;
                &lt;name&gt;minPoolSize&lt;/name&gt;
                &lt;value&gt;3&lt;/value&gt;
              &lt;/parameter&gt;

            &lt;/ResourceParams&gt;
        &lt;/Context&gt;
. . .
No web.xml vai algo assim:
. . .
   &lt;resource-ref&gt;
  		&lt;description&gt;qq descricao&lt;/description&gt; 
		&lt;res-ref-name&gt;bean/DataSourceBeanFactory&lt;/res-ref-name&gt; 
  	           &lt;res-type&gt;seupacote.DataSourceBean&lt;/res-type&gt;
   		&lt;res-auth&gt;Container&lt;/res-auth&gt; 
    &lt;/resource-ref&gt;   
    . . .

Eu prefiro trabalhar com BeanFactory para poder incluir qualquer tipo de propriedade e não apenas aquelas que o Tomcat previu.

[]s
Luca

P

nao, kara eu quero saber o porque que nao ta funcionando do jeito que estou fazendo, alguem ae saka?

fcanjos

Ola,

Achei estranho os atributos path e docBase da tag Context do seu.xml estarem em branco. Até onde eu sei, eles deveriam ter o caminho relativo para a aplicação (ex: /teste) e o caminho absoluto no filesystem (ex: /home/tomcat/webapps/teste ou apenas teste se estiver dentro do webapps) respectivamente.
Porém, eu uso a versão do tomcat que eu uso é a 5.0.28. Talvez algo tenha mudado.
Respondendo suas outras perguntas, já consegui criar datasources de ambas as formas, muito embora tenha encontrado alguns problemas em algumas ocasiões.
O web.xml que vc tem que configurar é aquele dentro de sua aplicação.
Aqui vai, um .xml que esta funcionando, lembrando que a versão utilizada é a 5.0.28

<?xml version='1.0' encoding='utf-8'?> url jdbc:mysql://localhost:3306/bbbb?autoReconnect=true password xxx maxActive 50 maxWait 5000 driverClassName org.gjt.mm.mysql.Driver username uuuu maxIdle 100
P

fcanjos,

tem alguma ordem especifica para inserir esse xml dentro do web.xml?
e antes da tag </hosts>

?

P

manda um exemplo ae, do web.xml seu!

fcanjos

Esse xml que mandei antes nao deve ficar no seu web.xml.
o codigo do web.xml que vc mandou antes esta correto.
esse xml deve ficar num arquivo de nome seu_contexo.xml dentro do $CATALINA_HOME/conf/Catalina/localhost/
Ele é criado automaticamente toda vez que vc cria um contexto.
Tira o que vc colocou no server.xml.

P

no tomcat 5.0.28 funciona, no tomcat 5.5.7 faço o mesmo processo e nao funciona… sera porque?

:oops:

fcanjos

eu ainda nao usei o tomcat 5.5.7 mas ja li que a sintaxe da tag resource mudou. Dá uma olhada na documentação.
http://jakarta.apache.org/tomcat/tomcat-5.5-doc/jndi-resources-howto.html

P

kara muito estranho eu fiz o mesmo processo que voce falou no linux e tudo funcionou , agora eu estou fazendo no windows, e nada funciona continua dando aquele erro. sera porque?

no tomcat para windows na pasta work nao veio o a pasta Catalina/localhost eu criei ela na mao

assim, Catalina/localhost/Aplicacao correto? e mesmo assim nao funciona.

sera porque?

fcanjos

o xml fica na pasta conf/Catalina/localhost/ e nao na work/Catalina/localhost
De uma olhada tb se vc esta usando diretórios com espaço no nome…
tipo <contex docBase="C:\Arquivo de Programas\ …
Já ouvi dizer que issoa tb pode ser fonte de problemas…

P
Cannot create JDBC driver of class '' for connect URL 'null'
java.sql.SQLException: No suitable driver
	at java.sql.DriverManager.getDriver(DriverManager.java:243)
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:773)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:65)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:595)

veja o erro que da cara, fiz tudo certo!!

P

veja o arquivo postgresql.xml que ta no diretorio:

C:\jakarta-tomcat-5.0.28\conf\Catalina\localhost

<?xml version='1.0' encoding='utf-8'?>
	
  &lt;Context docBase="C:\\jakarta-tomcat-5.0.28\\webapps\\PROJETO" path="/PROJETO" reloadable="true" workDir="C:\\jakarta-tomcat-5.0.28\\work\\Catalina\\localhost\\PROJETO"&gt;

	 &lt;Resource auth="Container" description="Postgresql DB Connection" name="postgresql" type="javax.sql.DataSource"/&gt;
		&lt;ResourceParams name="postgresql"&gt;
			&lt;parameter&gt;
				&lt;name&gt;url&lt;/name&gt;
				&lt;value&gt;jdbc:postgresql://localhost:5432/banco&lt;/value&gt;
			&lt;/parameter&gt;

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

			&lt;parameter&gt;
				&lt;name&gt;maxActive&lt;/name&gt;
				&lt;value&gt;50&lt;/value&gt;
			&lt;/parameter&gt;

			&lt;parameter&gt;
				&lt;name&gt;maxWait&lt;/name&gt;
				&lt;value&gt;5000&lt;/value&gt;
			&lt;/parameter&gt;

			&lt;parameter&gt;
				&lt;name&gt;driverClassName&lt;/name&gt;
				&lt;value&gt;org.postgresql.Driver&lt;/value&gt;
			&lt;/parameter&gt;

			&lt;parameter&gt;
				&lt;name&gt;username&lt;/name&gt;
				&lt;value&gt;username&lt;/value&gt;
			&lt;/parameter&gt;
		
			&lt;parameter&gt;
				&lt;name&gt;maxIdle&lt;/name&gt;
				&lt;value&gt;100&lt;/value&gt;
			&lt;/parameter&gt;
	&lt;/ResourceParams&gt;
&lt;/Context&gt;

esse e o arquivo,

nesse tomcat 5.0.28 para windows nao veio a pasta Catalina/localhost dentro do work do container

entao eu crie as pastas C:\jakarta-tomcat-5.0.28\work\Catalina\localhost\SubwayInternet correto?

Eu joguei o jar do postgresql e o do pool e do dbcp dentro do common/lib do tomcat, ate ae tudo bem.

olha como esta meu web.xml dentro da minha aplicacao

<?xml version="1.0" encoding="UTF-8"?>

&lt;web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" &gt;

       &lt;description&gt;Postgres Connection Pooling Test&lt;/description&gt;

       &lt;resource-ref&gt;
           &lt;description&gt;DB Connection&lt;/description&gt;
           &lt;res-ref-name&gt;postgresql&lt;/res-ref-name&gt;
           &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
           &lt;res-auth&gt;Container&lt;/res-auth&gt;
       &lt;/resource-ref&gt;

&lt;/web-app&gt;

nada errado? nao é?

veja como esta meu codigo em java

Connection conn = null;
     try {
            Context initCtx = new InitialContext();
            DataSource ds = (DataSource) initCtx.lookup("java:comp/env/postgresql");

            try {
                conn = ds.getConnection();
                out.println("Conectado com sucesso");
            } catch (SQLException e1) {
                out.println(e1.getMessage());
            }
        } catch (NamingException e) {
            out.println(e.getMessage());
        }

e mesmo assim nao funciona porque?
sendo que no linux eu fiz a mesma coisa e funcionou!!!

alguem saka o porque?

abracos…

:frowning:

fcanjos

O nome do arquivo xml deve ser o nome da sua aplicação. Portanto se a sua aplicação se chama PROJETO o xml deve se chamar PROJETO.xml.
e este arquivo deve ficar na pasta C:\jakarta-tomcat-5.0.28\conf\Catalina\localhost

**** conf e nao work ***

andrevaladas

Pessoal na minha aplicação ja existia esse arquivo .xml dentro de conf/catalina… ai eu a o abri e adicionei o codigo acima, equando eu executo o Tomcat, ele volta o arquivo como antes, ouseja apaga o que acabei de inserir… o q pode ser isso? eu configuro o path da minha aplicação dentro do server.xml isso tem alguma coisa a ver?

kaoe

Estou usando o tomcat 5.5.9 e estou tendo o mesmo problema, ja utilizei isto em versões anteriores e funcionava, além deste problema estou tendo alguns com tagLib tmb…!! acho que realmente esta versão ta com algum problema.

kaoe

Realmente parece que o tomcat não esta inicializando as propriedades passadas no server.xml pois coloquei isto aqui

Context envContext  = (Context)initContext.lookup("java:/comp/env");
	BasicDataSource ds = (BasicDataSource)envContext.lookup("jdbc/MySQL");
	ds.setDriverClassName("com.mysql.jdbc.Driver");
	ds.setUrl("jdbc:mysql://localhost:3306/aspen?autoReconnect=true");
	ds.setUsername("root");
	ds.setPassword("");

e funcionou perfeitamente…!! claro que não é a maneira correta de usar mais pelo menos mostra que temos problemas.

felipeguerra

Eu tenho problemas sérios com isso também…

Quando eu configuro o pool no server.xml, não funciona, da o mesmo erro que o cara aí em cima está reportando…agora, se eu recorto o código do server.xml e colo no “minhaaplicacao.xml”, funciona perfeitamente!

E isso sempre aconteceu, se eu quiser deixar um recurso visívil para todas as minhas aplicações, não da, pq o “server.xml” não faz o papel dele.

vipseixas

Para quem ainda tem esse problema, a solução está aqui:

https://bugs.launchpad.net/ubuntu/+source/tomcat5.5/+bug/74781

Criado 28 de fevereiro de 2005
Ultima resposta 25 de jun. de 2007
Respostas 28
Participantes 8