C3p0!

Dae galera… eu achei um material sobre c3p0 e para teste criei a seguinte estrutura:

Classe que pega a conexão:

[code]public class ConnectionPool {

public static List init() throws SQLException, NamingException {
    InitialContext ic = new InitialContext(); 
    DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/pooledDS");
    List lista = new ArrayList();
    if (ds != null) {
        Connection conn = ds.getConnection();
        String sql = "select * from Documento";
        PreparedStatement psta = conn.prepareStatement(sql);
        ResultSet result = psta.executeQuery();
        while(result.next()) {
            lista.add(result.getString("NumDocumento"));
        }
        result.close();
        psta.close();
        conn.close();
    }    
    return lista;
}

}[/code]

Meu web.xml:

<resource-ref> <res-ref-name>jdbc/pooledDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
Na pasta do tomcat nesse endereço:

C:\Arquivos de programas\Apache Software Foundation\Apache Tomcat 6.0.14\conf\Catalina\localhost

Tem o arquivo referente a minha aplicação e ele foi definido assim:

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

factory org.apache.naming.factory.BeanFactory driverClass com.mysql.jdbc.Driver jdbcUrl jdbc:mysql://localhost:3306/controleDocumentos?autoReconnect=true user root password admin minPoolSize 5 maxPoolSize 15 acquireIncrement 5 [/code]

Estou com as bibliotecas:

mysql-connector-java-5.0.7-bin.jar c3p0-0.9.1.jar

Criei um jsp que chama um servlet e executa o método da classe

ConnectionPool.init();

Quando clico no link, ele me gera o seguinte erro:

javax.naming.NamingException: Cannot create resource instance at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at org.apache.naming.NamingContext.lookup(NamingContext.java:793) at org.apache.naming.NamingContext.lookup(NamingContext.java:140) at org.apache.naming.NamingContext.lookup(NamingContext.java:781) at org.apache.naming.NamingContext.lookup(NamingContext.java:140) at org.apache.naming.NamingContext.lookup(NamingContext.java:781) at org.apache.naming.NamingContext.lookup(NamingContext.java:140) at org.apache.naming.NamingContext.lookup(NamingContext.java:781) at org.apache.naming.NamingContext.lookup(NamingContext.java:153) at org.apache.naming.SelectorContext.lookup(SelectorContext.java:137) at javax.naming.InitialContext.lookup(InitialContext.java:351) at ConnectionPool.init(ConnectionPool.java:24) at ServletPool.processRequest(ServletPool.java:33) at ServletPool.doGet(ServletPool.java:49) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595)
Procurei em alguns lugares e praticamente o meu está igual… não estou entendendo o que está acontecendo… alguém tem alguma idéia?

Cara… valeu pela dia… mas eu vou ter que pegar um sistema que já existe e alterar ele utilizando o pool… dae nesse sistema eles utilizam jdbc puro… então tenho que fazer mais ou menos do jeito que coloquei acima… abraço!!
No aguardo…

Ninguém usa o C3P0?

Eu Uso.

Só um momento, deixa eu analizar o que você tem ae, com o que eu fiz aqui…

c3p0-config.xml (Dentro do Package Default)

<c3p0-config> <default-config> <property name="acquireIncrement">5</property> <property name="acquireRetryAttempts">10</property> <property name="acquireRetryDelay">1000</property> <property name="autoCommitOnClose">false</property> <property name="checkoutTimeout">60000</property> <property name="initialPoolSize">10</property> <property name="maxConnectionAge">1800</property> <property name="maxIdleTime">1800</property> <property name="maxPoolSize">50</property> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> <property name="minPoolSize">15</property> <property name="unreturnedConnectionTimeout">180</property> <property name="debugUnreturnedConnectionStackTraces">true</property> </default-config> </c3p0-config>

c3p0.properties (Dentro do Package Default)

[code]com.mchange.v2.c3p0.management.ManagementCoordinator=com.mchange.v2.c3p0.management.NullManagementCoordinator
log4j.logger.com.mchange.v2.c3p0=warn

[/code]

Exemplo.:

[code]import java.sql.Connection;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Teste {

private static ComboPooledDataSource comboPooledDS = null;

public void executar() {
    try {
        
        comboPooledDS = new ComboPooledDataSource();
        comboPooledDS.setDriverClass("com.mysql.jdbc.Driver");
        comboPooledDS.setJdbcUrl("jdbc:mysql://localhost:3306/controleDocumentos");
        comboPooledDS.setUser("root");
        comboPooledDS.setPassword("admin");
        comboPooledDS.setDebugUnreturnedConnectionStackTraces(true);
        
        for (int i = 0; i < 10; i++) {
            Connection connection = comboPooledDS.getConnection();
            System.out.println(i + ": " + connection.toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
        return;
    }
}

public static void main(String args[]) {
    C3P0Teste teste = new C3P0Teste();
    teste.executar();
}

}
[/code]

Esse exemplo que mandasse vc utiliza ele para web? Se for, então porque configurá-lo no Tomcat? Sendo que vários materias que encontrei, a configuração dele fica no context e web.xml… e pegaria ele com
DataSource ds = (DataSource) envCtx.lookup(“jdbc/”+jndiName);
Não entendi qual a diferença…

Algumas outras dúvidas… fiz um teste aqui utilizando mais ou menos o que vc passou e a cada F5 que dou na página, ele replica no número de conexões… tipo. se o minimo foi 10, a cada F5 na página, ele abria + 10, sendo que o máximo configurado era 20… tipo… quando eu definir um npumero mínimo, esse mínimo já tem que ficar aberto, certo?
Se eu abrir outra pagina e me conectar ele teria que pegar uma conexão dessas 10, dae quando chegar em mais de 10 conexões, ele iria abrir mais algumas para suprir os outros usuários… seria isso?

Dae galera… consegui fazer dessa forma… só algumas coisas que queria saber…
Queria que me ajudasse em uma configuração para controlar mais ou menos 500 usuários simultaneos… a idéia seria a seguinte… ele teria um mínimo definido e quando chegasse no máximo, ele teria que aumentar mais as conexões… teria como definir um número que ele pudesse passar do máximo?? E o que mais eu tenho que levar em consideração?? Tem alguma configuração que teria que estar no context.xml que não fiz??
Abraço!

public static Connection getConnection(String jndiName) throws SQLException, NamingException { Connection conn = null; try { InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/" + jndiName); if (ds == null) { throw new NamingException("Datasource not found"); } conn = ds.getConnection(); if (conn == null) { throw new SQLException("Could not get connection"); } } catch (SQLException e) { throw new SQLException(e.getMessage()); } catch (NamingException e) { throw new NamingException(e.getMessage()); } return conn; }
context.xml

[code]<?xml version='1.0' encoding='utf-8'?>

[/code]

[code]web.xml

<resource-ref> 
    <res-ref-name>jdbc/pooledDS</res-ref-name>         
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth>         
</resource-ref>          [/code]

Leia a Documentação: http://www.mchange.com/projects/c3p0/index.html
Baixar os Exemplos prontos só irá te limitar.

Da uma olhada nesse site …esse framework vai ti ajudar !!!

https://boxsql.dev.java.net/

ele ja faz toda a parte de pool de conexao