Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457

    Hiberante - Problemi di connessioni

    Buongiorno,
    sto utilizzando Hibernate per l'accesso al db.
    Ho implementato uno schedulatore che fa diverse connessioni al db.

    Il processo mi restituisce la seguente stringaata source rejected establishment of connection, message from server: "Too many connections"...

    Che cosa bisognerebbe settare nel file hibernate.cfg.xml ... ? Potete darmi qualche dritta?

    Grazie tante

    Di seguito lo stack dell'eccezione:

    codice:
    org.hibernate.util.JDBCExceptionReporter logExceptionsGrave: Data source rejected establishment of connection,  message from server: "Too many connections"
    Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection
    	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
    	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
    	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
    	at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
    	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    	at org.hibernate.loader.Loader.doList(Loader.java:2220)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    	at org.hibernate.loader.Loader.list(Loader.java:2099)
    	at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    	at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    	at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    	at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
    	at DaoImpl.DaoImpl.readScheduler(DaoImpl.java:46)
    	at schedulerreport.ApplicazioneMain.avviaReport(ApplicazioneMain.java:24)
    	at schedulerreport.SchedulerReport.main(SchedulerReport.java:19)
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    	at com.mysql.jdbc.Util.getInstance(Util.java:386)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1110)
    	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
    	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
    	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
    	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
    	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    	at sun.reflect.GeneratedConstructorAccessor11.newInstance(Unknown Source)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
    	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
    	at java.sql.DriverManager.getConnection(DriverManager.java:571)
    	at java.sql.DriverManager.getConnection(DriverManager.java:187)
    	at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
    	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
    	... 15 more
    Java Result: 1

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    Ho rieseguito il processo e ho ottenuto la seguente informazione:

    Informazioni: Hibernate connection pool size: 20
    apr 29, 2014 9:53:01 AM org.hibernate.connection.DriverManagerConnectionPr ovider configure
    Informazioni: autocommit mode: false
    apr 29, 2014 9:53:01 AM org.hibernate.connection.DriverManagerConnectionPr ovider configure
    Informazioni: using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://vodatest.rclou.prv:3306/vodafta?zeroDateTimeBehavior=convertToNull
    apr 29, 2014 9:53:01 AM org.hibernate.connection.DriverManagerConnectionPr ovider configure
    Informazioni: connection properties: {user=12345, password=****}
    apr 29, 2014 9:53:01 AM org.hibernate.cfg.SettingsFactory buildSettings
    Avvertenza: Could not obtain connection metadata
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientC onnectionException: Data source rejected establishment of connection, message from server: "Too many connections"


    che vuol dire Hibernate connection pool size: 20?
    Ultima modifica di Mitele; 29-04-2014 a 10:13 Motivo: dati priv

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mitele Visualizza il messaggio
    che vuol dire Hibernate connection pool size: 20?
    Che evidentemente Hibernate è stato configurato per usare un connection pool che tiene un numero minimo o fisso di connection.
    Con solo quanto postato però non è chiaro quale connection pool, verifica in hibernate.cfg.xml ed eventualmente posta qui la parte che riesci ad individuare riguardo il connection pool.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Che evidentemente Hibernate è stato configurato per usare un connection pool che tiene un numero minimo o fisso di connection.
    Con solo quanto postato però non è chiaro quale connection pool, verifica in hibernate.cfg.xml ed eventualmente posta qui la parte che riesci ad individuare riguardo il connection pool.
    Grazie mille per avermi risposto....

    ecco il file hibernata.cfg.xml
    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
      <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://xxxxtest.xxxxcloud.prv:3306/xxxxfoneta?zeroDateTimeBehavior=convertToNull</property>
        <property name="hibernate.connection.username">xxxx</property>
        <property name="hibernate.connection.password">xxxx</property>
        <mapping resource="POJO/Device.hbm.xml"/>
        <mapping resource="POJO/Test.hbm.xml"/>
        <mapping resource="POJO/Setting.hbm.xml"/>
        <mapping resource="POJO/User.hbm.xml"/>
        <mapping resource="POJO/Ciclotest.hbm.xml"/>
        <mapping resource="POJO/Computer.hbm.xml"/>
        <mapping resource="POJO/Sendreport.hbm.xml"/>
        <mapping resource="POJO/Scheduler.hbm.xml"/>
        <mapping resource="POJO/Computerdevice.hbm.xml"/>
        <mapping resource="POJO/Esecuzione.hbm.xml"/>
        <mapping resource="POJO/Grant.hbm.xml"/>
        <mapping resource="POJO/Ciclo.hbm.xml"/>
        <mapping resource="POJO/Invalidcode.hbm.xml"/>
        <mapping resource="POJO/Failcode.hbm.xml"/>
      </session-factory>
    </hibernate-configuration>
    Cosa dovrei fare? Io ad ogni ciclo apro la connessione leggo i dati dal db,e infine la chiudo...
    Per favore dammi qualche input... grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    In sintesi ho un ciclo while all'infinito:
    codice:
    while (true){
     elaboraB(...);
    elaboraA(...);
    elaboraC(...);
    }
    ogni chiamata esegue:
    codice:
     Session conn=new Configuration().configure().buildSessionFactory().openSession();
    
    conn.close;
    Adesso ho settato <property name="hibernate.connection.pool_size">100</property> ma comunque mi restituisce
    Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection...

    Cosa dovrei fare? Cosa sbaglio?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mitele Visualizza il messaggio
    ecco il file hibernata.cfg.xml
    Non c'è niente di esplicito qui riguardo un connection pool. Quindi presumo che Hibernate stia usando il suo connection pool interno che, come dice la documentazione, è "rudimentale" e sarebbe meglio usare un connection pool esterno.

    Innanzitutto guarda la documentazione ufficiale:
    1.2. Connection pooling

    E poi scegli e configura il connection pool esterno (chiaramente serviranno uno o più altri jar).

    Quote Originariamente inviata da Mitele Visualizza il messaggio
    Io ad ogni ciclo apro la connessione leggo i dati dal db,e infine la chiudo...
    Infatti è per questo che sono utili i connection pool. Senza connection pool sei sempre lì a creare nuove Connection e a chiuderle e "buttarle" via. Ed è "costoso" in termini di tempo e risorse. Con un connection pool, quando chiudi la Connection, essa "ritorna" al pool ed è disponibile per altre richieste.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    S' ma perchè mi dice Too many connections"Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection...

    In che senso troppe connessioni? Se io apro e chiudo.... A me serve una connessione per interrogare il database...Siccome non ho molto tempo, ma me ne rimane poco, c'è una soluzione piu veloce?
    Io accedo al database solo con un utente, mi sembra di capire che i pool di connessione servono se ci sono accessi al database in parallelo... giusto?
    Io ho solo un utente che fa l'accesso... Hai qualche idea?
    Io avrei questa: apro una connessione e non la chiudo più visto che il ciclo è all'infinito
    Ultima modifica di Mitele; 29-04-2014 a 11:25

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    E' possibile con Hibernate lavorare senza un pool di connessioni?
    In dettaglio: apro e chiudo la connessione.... Come si fa a dire ad hibernate di non utilizzare il pool?
    Basta impostare hibernate.connection.pool_size=0 ( <property name="hibernate.connection.pool_size">0</property>)?

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    Salve ho trovato una soluzione anche se non è una delle migliori.

    Prima del ciclo while(true){} apro la connessione e non la chiudo più. Mi piacerebbe sapere se è possibile usare hibernate senza un pool di connessioni... come avevo già detto sopra, apro la connessione eseguo la query e la chiudo....è possibile???

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    Il programma sta ancora girando, ma credo che la soluzione sia questa:

    codice:
    public class DaoImpl implements Dao{
        private static final SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();  // Qui creo una sessione
        
       public Session openConnection(){
           Session sessione;
         
              sessione=sessionFactory.openSession();
           
         return sessione;
       } 
       
       public Scheduler  readScheduler()throws Exception{
            
           Session conn=openConnection();
          
            String queryString= "select * from scheduler";
            
             Query query = conn.createSQLQuery(
                queryString)
               .addEntity(Scheduler.class);
           
              List lista = query.list();
              Scheduler scheduler=(Scheduler) lista.get(0);
    
    
           conn.close();
           
         return scheduler;
       }
       
       public void  UpdateScheduler(Scheduler sc) throws Exception{
           
            Session conn=openConnection();
            conn.beginTransaction();
             conn.update(sc);
            conn.getTransaction().commit();
          conn.close();
       }
       
       public List<Sendreport> getUtentiPerReport(String frequenza) throws Exception{
           
           Session conn=openConnection();
           
           String queryString="select * from sendreport r where ";
           int flag=1;
           if(frequenza.equalsIgnoreCase("Hourly")){
               queryString+="r.Hourly= :flag";
           }
           if(frequenza.equalsIgnoreCase("Daily")){
               queryString+="r.Daily= :flag";
           }
           if(frequenza.equalsIgnoreCase("Weekly")){
               queryString+="r.Weekly= :flag";
           }
           if(frequenza.equalsIgnoreCase("Monthly")){
               queryString+="r.Monthly= :flag";
           }
           
           Query query = conn.createSQLQuery(
                queryString)
                .addEntity(Sendreport.class)
                .setParameter("flag",flag);   
           
           List listaUtenti = query.list();
           
           conn.close();
         return listaUtenti;
       }
    Ho spostato sessionFactory dal metodo openConnection() sotto la lista degli attributi della classe DaoImpl così ogni volta che viene chiamato il metodo openConnection non viene generata una nuova connessione ma apre sempre la stessa... Siete d'accordo con me??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.