DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
CARLOS EDUARDO DOMINGUES MAZZI
 

País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 26/4/2010 5:17:51 PM

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.
 
ANGELO BRANDãO MIRANDA SANTOS
 
 


País: Brasil
Estado: BA
Cidade: Salvador
Mensagens: 57
 Postado em: 26/4/2010 9:46:23 PM

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.

 

 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 27/4/2010 6:23:25 AM
Entao... hoje esta em "1800"... vc sugere que quanto, seria o suficiente? Quanto vc usa normalmente ?
Mas tbm, pq são necessarias tantas conexoes?
 

 
ANGELO BRANDãO MIRANDA SANTOS
 
 


País: Brasil
Estado: BA
Cidade: Salvador
Mensagens: 57
 Postado em: 27/4/2010 3:49:36 PM
Carlos,

     Coloque 5000 e teste.

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 27/4/2010 3:56:18 PM
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 ?


 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 27/4/2010 6:47:52 PM
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();
        }
    }
   
}
 
 
 
 
 
 
 
                       
 

 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 27/4/2010 7:33:00 PM
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)??
      
 

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 29/4/2010 9:01:05 AM
A cada  openSession que voce gera , voce PRECISA fechar ela...

session.close();


Experimente e me diga !


 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 29/4/2010 9:08:28 AM
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?
 
 

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 30/4/2010 5:08:48 PM
Muito Estranho...

Voce esta usando MySQL ?


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



 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 4/5/2010 3:46:21 PM
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.
 
 

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 4/5/2010 4:32:26 PM
Muito Estranho...

Qual a versão do Hibernate ?

Tá usando GlassFish ou Tomcat ?


Quais versoes ?


 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 4/5/2010 5:14:31 PM
Hibernate 3.2
GlassFish v3 prelude domain

 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 5/5/2010 4:02:01 PM
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)?

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 6/5/2010 2:44:40 PM
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 :)


 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 6/5/2010 11:36:12 PM
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... 
 
 

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 9/5/2010 4:25:32 PM
Exato.


 
CARLOS EDUARDO DOMINGUES MAZZI
 
 


País: Brasil
Estado: SP
Cidade: LINS
Mensagens: 591
 Postado em: 9/5/2010 6:14:54 PM
Então, ... fechado companheiro.. Muito Obrigado, forte abraço.

 
DYEGO SOUZA DO CARMO
 
 


País: Brasil
Estado: PR
Cidade: xxxxx
Mensagens: 1836
 Postado em: 10/5/2010 5:26:39 PM
Valeu !

 
Faustino Júnior
 

País: Brasil
Estado: PI
Cidade: TERESINA
Mensagens: 8
 Postado em: 29/3/2012 4:22:13 PM
Senhores.

Finalmente um post com informações bastante úteis.

Tenho software asp.net com C#, e estou com os mesmos problemas que o amigo acima descreveu.
Alguém pode recomendar um post sobre o assunto ? ou poderia responder sobre as conexões asp.net c#.

 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03