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?
Nie używaj 'session.close()' jeśli uzyskałeś sesję przez 'getCurrentSession()'. To prawdopodobnie wyczerpuje twoją pulę połączeń. – 11thdimension
Dzięki za odpowiedź, ale to nie zadziałało. Nadal otrzymuję ten sam wyjątek. – Alessandro
Oznacza to, że pula połączeń naprawdę wyczerpała wszystkie połączenia, czy jest zbyt wiele długich wywołań bazy danych? – 11thdimension