[RESOLVIDO] Erro com pool de conexões

6 respostas
fmachado.dev

Boa tarde!
Bom eu estou com um problemão utilizando hibernate + c3p0 + blazeds + flex
sem o c3p0 roda normalmente, porém não tenho configurado um pool de conexões, ruim pois meu sistema vai ser limitado
porém quando configuro meu c3p0 e fazer muitas requisições ao banco rapidamente ele a seguinte exception

java.sql.SQLException: You can't operate on a closed Statement!!!
could not execute query
org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 1.
org.hibernate.exception.DataException: could not execute query
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:77)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.loader.Loader.doList(Loader.java:2216)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
        at org.hibernate.loader.Loader.list(Loader.java:2099)

meu hibernate.cfg.xml

<session-factory>


    <!--?autoReconnect=true-->
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/db_geolog</property>    
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">XXX</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="current_session_context_class">thread</property>
    <property name="cache.provider_class"></property>

    <!--<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>-->
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.timeout">50</property>
    <property name="hibernate.c3p0.max_statements">20</property>
    <property name="hibernate.c3p0.idle_test_period">50</property>
    <property name="hibernate.c3p0.acquire_increment">5</property>
    
    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>

minha classe de conexão é a seguinte (um singleton)

package br.com.geosapiens.igeolog.modelo.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class ConexaoDb {

    private SessionFactory sessionFactory = null;
    private Session sessao;

    public static class Singleton
    {
        public static ConexaoDb conexao = new ConexaoDb();
    }

    public static ConexaoDb getInstance()
    {
        return ConexaoDb.Singleton.conexao;
    }

    private void construirSeNecessario() {

        try {
            if (sessionFactory == null) {
                //Configuration configuration = new Configuration();
                Configuration configuration = new AnnotationConfiguration();
                configuration.configure("/br/com/geosapiens/igeolog/modelo/util/hibernate.cfg.xml");
                sessionFactory = configuration.buildSessionFactory();
                sessao = sessionFactory.openSession();
                System.out.println("Factory criada");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public Session openSession() {
        construirSeNecessario();
        try {
            //return sessionFactory.getCurrentSession();
            return sessao;
        } catch (Exception Ex) {
            System.err.println(Ex.getMessage());
            //return sessionFactory.openSession();
            return null;
        }
    }

    public void close(Session session) {
        if (session != null) {
            try {
                session.close();
            } catch (HibernateException ex) {
                System.err.println("Impossível fechar sessão: " + ex.getMessage());
            }
        }
    }

    public SessionFactory getFactory() {
        construirSeNecessario();
        return sessionFactory;
    }
}

e como faço minhas requisições (um exemplo apenas)

public List<TipoSiteProxy> executeList() throws Exception{
        try {
        List<TipoSite> tiposSite = tipoSiteDao.findAll(Controle.getInstance().getUsuario().getEmpresa().copy());

        List<TipoSiteProxy> tiposSiteProxy = new ArrayList<TipoSiteProxy>();
        for(TipoSite tipo:tiposSite){
            tiposSiteProxy.add(new TipoSiteProxy(tipo));
        }
        return tiposSiteProxy;
        }catch (Exception ex){
            System.out.println(ex.getMessage());
            System.out.println(ex.getCause());            
            ex.printStackTrace();
            Session teste = tipoSiteDao.getSession();
            return null;
        }

    }

bom é só no list que esta dando esse erro por isso não postei o resto dos códigos
e como são umas 30 classes eu não postei o mapeamento
obrigado pela ajuda desde já
[/code]

6 Respostas

Java_Lover

Sem muitos rodeios. Conserte esse problema em definitivo. :thumbup:
Abaixo meus exemplos, se não gostar apenas desconsidere.

server.xml &lt;GlobalNamingResources&gt; &lt;Resource auth="Container" driverClassName="org.postgresql.Driver" logAbandoned="true" removeAbandonedTimeout="60" maxActive="50" maxIdle="10" maxWait="-1" name="jdbc/bd" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/bd" username="postgres" password="admin"/&gt;
web.xml &lt;resource-ref&gt; &lt;res-ref-name&gt;jdbc/bd&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;
hibernate.cfg.xml&lt;hibernate-configuration&gt; &lt;session-factory&gt; &lt;property name="hibernate.dialect"&gt; org.hibernate.dialect.PostgreSQLDialect &lt;/property&gt;
context.xml&lt;Context&gt; &lt;ResourceLink global="jdbc/bd" name="jdbc/bd" type="com.mchange.v2.c3p0.ComboPooledDataSource" /&gt; &lt;Logger className="org.apache.catalina.logger.FileLogger" prefix="suaApp." suffix=".out" timestamp="true"/&gt; &lt;/Context&gt;
connection.propertiesconnection.jndi=java:comp/env/jdbc/bd
c3p0.propertiesc3p0.minPoolSize=5 c3p0.maxPoolSize=10 c3p0.maxIdleTime=60 c3p0.maxStatements=0 c3p0.acquireIncrement=1 c3p0.idleConnectionTestPeriod=60
applicationContext-properties.xml &lt;property name="locations"&gt; &lt;list&gt; &lt;value&gt;classpath:connection.properties&lt;/value&gt; &lt;/list&gt; &lt;/property&gt;

fmachado.dev

que mal lhe pergunte fera, aonde eu coloco esses xml??
só esqueci de dizer que eu tenho 2 aplicações… uma desktop e outra web, que utiliza algumas classes dessa aplicação desktop,
o server.xml é do tomcat certo?
web.xml é a config da app web.
mas o applicationContext-properties.xml e o context.xml vai no web-inf mesmo?
os arquivos “.properties” tambem?

malz ai mas é que eu não usei as configurações jndi antes =D

anderson.bonavides

Observando a exceção gerada ver-se que ela acusa a ausência do parâmetro 1 da sua declaração.

fmachado.dev

anderson o problema é que ele executa a query umas 7 ou 8 vezes, mas quando repete demais da esse erro e depois volta a funcionar normalmente a aplicação.
entende? =D

fmachado.dev

Eu só gostaria de saber aonde eu coloco os arquivos connection.properties e c3p0.properties

fmachado.dev

Oooo pessoal muito obrigado pela ajuda…
agora eu entendi… vou mudar as configurações aqui e ver no da…
Pra quem ler o blog, o c3p0.properties e connection.properties vão no mesmo package do hibernate.cfg.xml…
então fico grato pela ajuda mesmo

Criado 26 de maio de 2010
Ultima resposta 27 de mai. de 2010
Respostas 6
Participantes 3