GARANTIR DESCONTO

Fórum Hibernate X Problema de conexao #376357

26/04/2010

0

Galera!, pode ser que o assunto seja ou esteja meio repetitivo, mas pelo menos aqui, ainda nao foi solucionado, entao peço encarecidamente a ajuda de voces...   É o seguinte, tenho uma aplicacao (JSF+JPA+hibernate, com MySQL server 5.0 com servidor GlassFish), que tem uma configuração de conexao (Factory) assim:       public HibernateUtil(){
         sessionFactory = new AnnotationConfiguration()
         .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
         .setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver")
         .setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/apollo")
         .setProperty("hibernate.connection.username","root")
         .setProperty("hibernate.connection.password","*******")
         .setProperty("hibernate.hbm2dll.auto","none")
         .setProperty("hibernate.show_sql","true")
         .setProperty("hibernate.format_sql","true")
         .setProperty("hibernate.c3p0.acquire_increment","2")            .setProperty("hibernate.c3p0.idle_test_period","50")
         .setProperty("hibernate.c3p0.max_size","20")        //antes 1000
         .setProperty("hibernate.c3p0.max_statements","100") //ULTIMA ALTERAO SAO OS VALORES DE 1000, isso porque dava um erro de processamento apos N instancia no servidor//
         .setProperty("hibernate.c3p0.min_size","1")
         .setProperty("hibernate.c3p0.timout","1800")      
         .setProperty("hibernate.c3p0.validate", "true")
         .setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "10")
         .setProperty("transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory")
         .setProperty("current_session_context_class", "thread") ---------------------- O PROBLEMA, : --------------------- é que ao chegar nas "20" conexoes (ou 1000 como estava antes , na linha em destaque...), a conexao cai, o sistema nao vai nem a pa.........     Já tentei de tudo, alguem tem uma luz??? Pra vcs falta alguma propriedade a ser configurada?   Grato.  
Carlos Mazzi

Carlos Mazzi

Responder

Posts

26/04/2010

Angelo Santos


Carlos,

     Sugiro que você aumente o timeout, pois quando sua aplicação atingir o numero máximo de conexão, as conexões que ultrapassam o limite vão para um queue (fila), se o timeout estiver com um valor pequeno as conexões serão recusadas, já que as mesmas estão esperando em uma fila.

 
Responder

Gostei + 0

27/04/2010

Carlos Mazzi

Entao... hoje esta em "1800"... vc sugere que quanto, seria o suficiente? Quanto vc usa normalmente ? Mas tbm, pq são necessarias tantas conexoes? 
Responder

Gostei + 0

27/04/2010

Angelo Santos

Carlos,

     Coloque 5000 e teste.
Responder

Gostei + 0

27/04/2010

Dyego Carmo

Estranho hein ? Voce tá abrindo uma conexao com o banco para CADA usuario conectado ?

Como que vc esta criando suas sessionfactorys... pode colar o codigo aqui ?

Responder

Gostei + 0

27/04/2010

Carlos Mazzi

olhem só...   HibernateUtil.java ------------------------   public class HibernateUtil implements java.io.Serializable{     private static final long serialVersionUID =1L;
    private static HibernateUtil me;
    private SessionFactory sessionFactory;
    public HibernateUtil(){
         sessionFactory = new AnnotationConfiguration()
         .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
         .setProperty("hibernate.connection.driver_class","com.mysql.jdbc.Driver")
         .setProperty("hibernate.connection.url","jdbc:mysql://localhost:3306/apollo")
         .setProperty("hibernate.connection.username","root")
         .setProperty("hibernate.connection.password","*****")
         .setProperty("hibernate.hbm2dll.auto","none")
         .setProperty("hibernate.show_sql","true")
         .setProperty("hibernate.format_sql","true")
         .setProperty("hibernate.c3p0.acquire_increment","2")  
         .setProperty("hibernate.c3p0.idle_test_period","50")
         .setProperty("hibernate.c3p0.max_size","20")                  .setProperty("hibernate.c3p0.max_statements","0") 
         .setProperty("hibernate.c3p0.min_size","1")
         .setProperty("hibernate.c3p0.timout","1800")                .setProperty("hibernate.c3p0.validate", "true")
         .setProperty("hibernate.c3p0.maxIdleTimeExcessConnections", "10")
         .setProperty("transaction.factory_class","org.hibernate.transaction.JDBCTransactionFactory")
         .setProperty("current_session_context_class", "thread")
    .. ... minhas classes anotadas aqui...(certinho)      
.buildSessionFactory();
                     }
    public Session getSession(){    
        Session toReturn = sessionFactory.openSession();
        toReturn.beginTransaction();
        return toReturn;
              
    }
    /*Inicia (Start) to Hibernate*/
    public static HibernateUtil getInstance(){
      if (me==null){
          me = new HibernateUtil();       }
      return(me);
    }
}
  -----------------------------------------------------------------------------------   E a cada manipulacao dos meus DAO's , uso um GenericDAO -----------------------------------------------------------------------------------   public abstract class GenericDAO {     private static final long serialVersionUID = 1L;
    protected boolean atualizar;     protected Session getSession() {
       
        return HibernateUtil.getInstance().getSession();
    }     protected void saveOrUpdatePojo(Serializable pojo) {
        Object classe = pojo.getClass().getName();         int setor = Integer.parseInt(jcUtil.getSessao("posto").toString());
        int usuario = Integer.parseInt(jcUtil.getSessao("usuario").toString());
        String hist;         classe = classe.toString().replace("com.Bean.", "");         Session ses = getSession();
        ses.saveOrUpdate(pojo);
        ses.getTransaction().commit();
        ses.refresh(pojo);
        ses.close();         Object reg = pojo.toString();         if (isAtualizar()) {
            hist = "Alterou um registro na tabela: " + classe + ". Registro: " + reg;
        } else {
            hist = "Inseriu um registro na tabela: " + classe + ". Registro: " + reg;
        }
        adicionarLog(setor, usuario, hist);
    }     protected <T extends Serializable> T getPojo(Class<T> classToSearch, Serializable key) {
        Session ses = getSession();
        Serializable toReturn = (Serializable) ses.get(classToSearch, key);
        ses.getTransaction().commit();
        ses.close();
        return (T) toReturn;
    }     protected void removePojo(Serializable pojoToRemove) {
        Object classe = pojoToRemove.getClass().getName();
        Object reg = pojoToRemove.toString();         int setor = Integer.parseInt(jcUtil.getSessao("posto").toString());
        int usuario = Integer.parseInt(jcUtil.getSessao("usuario").toString());
        String hist;         classe = classe.toString().replace("com.Bean.", "");
        hist = "Apagou um registro na tabela: " + classe + ". Registro: " + reg;
        Session ses = getSession();
        ses.delete(pojoToRemove);         ses.getTransaction().commit();
        ses.close();         adicionarLog(setor, usuario, hist);
    }     protected <T extends Serializable> List<T> getPureList(Class<T> classtoCast, String query, Object... params) {
        Session ses = getSession();
        Query qr = ses.createQuery(query);
        for (int i = 1; i <= params.length; i++) {
            qr.setParameter(i, params[i - 1]);
        }       está ai....Dyego...Abracos
        @SuppressWarnings("unchecked")
        List<T> toReturn = qr.list();         ses.getTransaction().commit();
        ses.close();         return toReturn;
    }     protected Serializable getPurePojo(String query, Object... params) {
        Session ses = getSession();
        Query qr = ses.createQuery(query);
        for (int i = 1; i <= params.length; i++) {
            qr.setParameter(i, params[i - 1]);
        }
        Object toReturn = qr.uniqueResult();         ses.getTransaction().commit();
        ses.close();         return (Serializable) toReturn;
    }         protected void adicionarLog(int posto, int usuario, String historico) {
        Session ses = getSession();         try {
            Date data = new Date();
            Calendar cal = Calendar.getInstance();
            String hora = cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND);             Auditoria aud = new Auditoria(posto, usuario);
            aud.setAudData(data);
            aud.setAudHora(hora);
            aud.setAudHistorico(historico);             ses.save(aud);
        } finally {
            ses.getTransaction().commit();
            ses.close();
            setAtualizar(false);
        }     }
   
    protected boolean isAtualizar() {
        return atualizar;
    }     protected void setAtualizar(boolean atualizar) {
        this.atualizar = atualizar;
    }
        protected Object jaExiste(String classe, String clausula) {
        Session ses = getSession();         try {
            Query q = ses.createQuery("SELECT obj FROM "+classe+" obj WHERE "+clausula);
            return q.uniqueResult();
        } finally {
            ses.close();
        }
    }
   
}
                                       
Responder

Gostei + 0

27/04/2010

Carlos Mazzi

E... continuando pelo que vejo, ao realizar uma consulta abre uma nova conexao... ao inserir abre outra conexao.. e assim por diante...   o sistema esta abrindo uma conexao pra cada manipulacao no banco...   ou seja a propriedade timout nao é o problema...   (já aumentei ou reduzi.. e o problema continua)   eu acho q está relacionado , da maneira q esta a conexao (getInstance) e (ou) a propriedade selecionada:   .setProperty("hibernate.c3p0.max_size","20")     pois ao alcancar a 20a. (vigesima) conexao.. o sistema cai... (trava)....   e assim por diante...   alguem viu algo de errado no meu codigo (factory)??         
Responder

Gostei + 0

29/04/2010

Dyego Carmo

A cada  openSession que voce gera , voce PRECISA fechar ela...

session.close();


Experimente e me diga !

Responder

Gostei + 0

29/04/2010

Carlos Mazzi

Ola, grande Dyego!... Entao, de acordo com o código do meu GenericDAO, ele já não está fechando a cada Session?, dá um olhadinha, pois só estou fechando por lá... OU seja meu GenericDao , pega o session criado pelo Hibernate, usa-o, e fecha a cada ses.close() ,   não seria isso?    
Responder

Gostei + 0

30/04/2010

Dyego Carmo

Muito Estranho...

Voce esta usando MySQL ?


Poderia dar um SHOW PROCESS LIST na hora que trava e colar aqui ?


Responder

Gostei + 0

04/05/2010

Carlos Mazzi

Sim é MYSQL server 5.1 Community   Na primeira tela, já disparando várias conexoes...   10, 'root', 'localhost:53375', 'requisicao', 'Sleep', 392, '', ''
13, 'root', 'localhost:53390', 'requisicao', 'Sleep', 237, '', ''
14, 'root', 'localhost:53391', 'requisicao', 'Sleep', 160, '', ''
19, 'root', 'localhost:53405', 'requisicao', 'Sleep', 159, '', ''
20, 'root', 'localhost:53406', 'requisicao', 'Sleep', 148, '', ''
22, 'root', 'localhost:53408', 'requisicao', 'Sleep', 148, '', ''
23, 'root', 'localhost:53409', 'requisicao', 'Sleep', 147, '', ''
24, 'root', 'localhost:53410', 'requisicao', 'Sleep', 133, '', ''
25, 'root', 'localhost:53413', 'requisicao', 'Sleep', 132, '', ''
26, 'root', 'localhost:53414', 'requisicao', 'Sleep', 132, '', ''
27, 'root', 'localhost:53415', 'requisicao', 'Sleep', 132, '', ''
32, 'root', 'localhost:53434', 'quantum', 'Sleep', 0, '', ''
33, 'root', 'localhost:53435', 'quantum', 'Query', 0, '', ''   aí conforme vou usando, o numero de conexoes, vai crescendo...       10, 'root', 'localhost:53375', 'requisicao', 'Sleep', 566, '', ''
13, 'root', 'localhost:53390', 'requisicao', 'Sleep', 411, '', ''
14, 'root', 'localhost:53391', 'requisicao', 'Sleep', 334, '', ''
19, 'root', 'localhost:53405', 'requisicao', 'Sleep', 333, '', ''
20, 'root', 'localhost:53406', 'requisicao', 'Sleep', 322, '', ''
22, 'root', 'localhost:53408', 'requisicao', 'Sleep', 322, '', ''
23, 'root', 'localhost:53409', 'requisicao', 'Sleep', 321, '', ''
24, 'root', 'localhost:53410', 'requisicao', 'Sleep', 307, '', ''
25, 'root', 'localhost:53413', 'requisicao', 'Sleep', 306, '', ''
26, 'root', 'localhost:53414', 'requisicao', 'Sleep', 306, '', ''
32, 'root', 'localhost:53434', 'quantum', 'Sleep', 0, '', ''
34, 'root', 'localhost:53439', 'requisicao', 'Sleep', 75, '', ''
35, 'root', 'localhost:53440', 'requisicao', 'Sleep', 34, '', ''
37, 'root', 'localhost:53445', 'requisicao', 'Sleep', 20, '', ''
39, 'root', 'localhost:53447', 'requisicao', 'Sleep', 4, '', ''
41, 'root', 'localhost:53449', 'requisicao', 'Sleep', 4, '', ''
42, 'root', 'localhost:53450', 'quantum', 'Query', 0, '', ''     E ASSIM vai indo.. o problema, é que ao chegar no numero máximo de conexões , estilpulado na nossa factory(acima tem o codigo), o sistema trava tudo.    
Responder

Gostei + 0

04/05/2010

Dyego Carmo

Muito Estranho...

Qual a versão do Hibernate ?

Tá usando GlassFish ou Tomcat ?


Quais versoes ?

Responder

Gostei + 0

04/05/2010

Carlos Mazzi

Hibernate 3.2 GlassFish v3 prelude domain
Responder

Gostei + 0

05/05/2010

Carlos Mazzi

Olha eu removi (no caso comentei a linha), das max_size, de conexões, agora tá rodando bem... ela abre umas 30, 50 conexoes... depois vai fechando se osciosas..   é assim mesmo?(resolvido)?
Responder

Gostei + 0

06/05/2010

Dyego Carmo

O funcionamento eh assim mesmo , para CADA sessao aberta é uma conexão ao banco...

conforme voce vai fechando as session ele NAO FECHA a conexao , prq se alguem pedir mais uma conexao ele nao precisa abrir , apenas passa...

quando dá o timeout ele fecha :)

Responder

Gostei + 0

06/05/2010

Carlos Mazzi

Entao... no meu caso, removendo a linha de max_size , das connections, parece que estabilizou, nao travou mais... pou seja essa linha é quantidade que o sistema pode alcancar de conexoes que ficam abertas e paralizava o sistema ao alcançar o tal limite, certo? Se vc concorda, Acho q fechou...     
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar