C3p0!

8 respostas
J

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

Classe que pega a conexão:

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;
    }
}
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:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/PoolConnection" docBase="C:\Documents and Settings\jvj000\Meus documentos\NetBeansProjects\PoolConnection\build\web">


<Resource name="jdbc/pooledDS" auth="Container" type="com.mchange.v2.c3p0.ComboPooledDataSource" /> 
<ResourceParams name="jdbc/pooledDS"> 
    <parameter> 
        <name>factory</name>
        <value>org.apache.naming.factory.BeanFactory</value> 
    </parameter> 
    <parameter> 
        <name>driverClass</name> 
        <value>com.mysql.jdbc.Driver</value> 
    </parameter> 
    <parameter> 
        <name>jdbcUrl</name>
        <value>jdbc:mysql://localhost:3306/controleDocumentos?autoReconnect=true</value> 
    </parameter> 
    <parameter> 
        <name>user</name> 
        <value>root</value> 
    </parameter> 
    <parameter> 
        <name>password</name> 
        <value>admin</value> 
    </parameter> 
    <parameter> 
        <name>minPoolSize</name> 
        <value>5</value> 
    </parameter> 
    <parameter> 
        <name>maxPoolSize</name> 
        <value>15</value> 
    </parameter> 
    <parameter> 
        <name>acquireIncrement</name> 
        <value>5</value> 
    </parameter> 
</ResourceParams> 
</Context>
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?

8 Respostas

J

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…

J

Ninguém usa o C3P0?

J

Eu Uso.

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

J
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)
com.mchange.v2.c3p0.management.ManagementCoordinator=com.mchange.v2.c3p0.management.NullManagementCoordinator
log4j.logger.com.mchange.v2.c3p0=warn

Exemplo.:

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();
    }
}
J

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?

J

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
<?xml version='1.0' encoding='utf-8'?>   
<Context path="/PoolConnection" docBase="PoolConnection"
        debug="5" reloadable="true" crossContext="true">
<Resource 
    auth="Container" 
    description="DB Connection" 
    driverClass="com.mysql.jdbc.Driver" 
    maxPoolSize="4" 
    minPoolSize="2" 
    acquireIncrement="1"
    name="jdbc/pooledDS"
    user="root" 
    password="admin" 
    factory="org.apache.naming.factory.BeanFactory"
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    jdbcUrl="jdbc:mysql://localhost:3306/controleDocumentos?autoReconnect=true" />

</Context>
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>
J

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

I

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

Criado 10 de abril de 2008
Ultima resposta 10 de abr. de 2008
Respostas 8
Participantes 3