2016-08-15 17 views
7

Używam Hibernate po raz pierwszy w projekcie uniwersyteckim i jestem początkującym użytkownikiem. Myślę, że po wszystkich instrukcji podanych przez mojego profesora i przez niektórych ćwiczeń, które czytam, ale wciąż otrzymuję wyjątek, który jest w tytule:Java/Hibernate - Wyjątek: Wewnętrzna pula połączeń osiągnęła maksymalny rozmiar i obecnie nie jest dostępne żadne połączenie.

Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available! 

Co staram się zrobić, to po prostu przechowywania obiektu (AbitazioneDB) do bazy danych MySql, którą już utworzyłem. To jest mój plik konfiguracyjny:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <!-- Connection to the database --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost:3306/AllarmiDomesticiDB</property> 

     <!-- Credentials --> 
     <property name="hibernate.connection.username">root</property> 
     <property name="connection.password">password</property> 

     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 

     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <property name="show_sql">true</property> 

     <!-- Entity --> 

     <mapping class="it.allarmiDomestici.centraleOperativaRemota.dbWrapper.AbitazioneDB" /> 

    </session-factory> 
</hibernate-configuration> 

To mój AbitazioneDB klasa (będę omitt pobierające i ustawiające):

@Entity 
@Table(name="abitazioni") 
public class AbitazioneDB { 

    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private Integer id; 

    @Column(name="indirizzo") 
    private String indirizzo; 

    @Column(name="nome_proprietario") 
    private String nomeProprietario; 

    @Column(name="tel_proprietario") 
    private String telProprietario; 

    public AbitazioneDB(){ 
     super(); 
    } 

    public AbitazioneDB save(){ 

     SessionFactory sf = HibernateUtil.getSessionFactory(); 
     Session session = sf.getCurrentSession(); 
     session.beginTransaction(); 

     Integer id = (Integer) session.save(this); 
     this.setId(id); 

     session.getTransaction().commit();  
     session.close(); 

     return this; 
    } 
} 

To mój HibernateUtil klasa:

public class HibernateUtil { 

    private static SessionFactory sessionFactory; 

    private static SessionFactory createSessionFactory() { 
     sessionFactory = new Configuration().configure().buildSessionFactory(); 
     return sessionFactory; 
    } 

    public static SessionFactory getSessionFactory() { 
     if (sessionFactory == null) 
      sessionFactory = createSessionFactory(); 

     return sessionFactory; 
    } 
} 

I to jest moja klasa TestHibernate, z main metoda:

public class TestHibernate { 

    public static void main(String[] args) { 
     AbitazioneDB ab = new AbitazioneDB(); 

     ab.setIndirizzo("Via Napoli, 29"); 
     ab.setNomeProprietario("Mario Rossi"); 
     ab.setTelProprietario("3333333333"); 

     ab.save(); 

     System.out.println("Ok!"); 

    } 
} 

Kiedy biegnę TestHibernate zawsze uzyskać ten wyjątek i nie mam pojęcia dlaczego. Może powinienem zmienić właściwość connection.pool_size, ale jeśli to zrobię, wydaje mi się, że dostaję więcej błędów. Czy ktoś może mi pomóc?

+0

Nie używaj 'session.close()' jeśli uzyskałeś sesję przez 'getCurrentSession()'. To prawdopodobnie wyczerpuje twoją pulę połączeń. – 11thdimension

+0

Dzięki za odpowiedź, ale to nie zadziałało. Nadal otrzymuję ten sam wyjątek. – Alessandro

+0

Oznacza to, że pula połączeń naprawdę wyczerpała wszystkie połączenia, czy jest zbyt wiele długich wywołań bazy danych? – 11thdimension

Odpowiedz

7

Spróbuj tego:

HibernateUtil:

public static Session getHibernateSession() { 

    final SessionFactory sf = new Configuration() 
     .configure("yourConfig.cfg.xml").buildSessionFactory(); 

    // factory = new Configuration().configure().buildSessionFactory(); 
    final Session session = sf.openSession(); 
    return session; 
    } 

i zamiast korzystania SessionFactory użytkowania Sesja:

final Session session = HibernateUtil.getHibernateSession(); 

a następnie użyć:

Transaction tx = session.beginTransaction(); 
// all your methods 
tx.commit(); 
session.close(); 

Mam nadzieję, że to pomoże.

W rzeczywistości nie możesz mieć tej właściwości puli połączeń w swoim hbm, jeśli jej nie potrzebujesz.

+0

Dziękuję za odpowiedź, ale wciąż brak wyników. – Alessandro

+0

@Alessandro Czy próbowałeś usunąć tę właściwość z twojego config xml? –

+0

@Alessandro I zamiast mieć tę metodę zapisu wewnątrz klasy POJO, możesz spróbować i mieć ją w głównej metodzie. –

8

Pula połączeń wyczerpała połączenia, ponieważ używasz pojedynczego połączenia w puli.

<property name="connection.pool_size">1</property> 

Zmiana ta właściwość do czegoś, co będzie można komfortowo, jak 100

+1

Jeszcze raz dziękuję za odpowiedź, ale, jak powiedziałem w moim oryginalnym poście, nie wydawało się to pomocne. – Alessandro

+0

To faktycznie zadziałało dla mnie. –

+0

Tutaj też pracowałem, dzięki! –

5
<property name="connection.pool_size">1</property> 

Spróbuj zmienić rozmiar puli połączeń do większego rozmiaru, jak 100 lub tak.

<property name="connection.pool_size">100</property> 
+1

To wydaje się być powtórzeniem [tej istniejącej odpowiedzi] (http://stackoverflow.com/questions/38960921/java-hibernate-exception-the-internal-connection-pool-has-soached-its-maximum/38961145#38961145). – Pang