I'm using Hibernate for the first time for a University project and I'm a bit of a newbie. I think I followed all the instructions given by my professor and by some tutorials I read, but I keep getting the Exception that is in the title:
Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available!
What I'm trying to do is simply storing an object (AbitazioneDB) into a MySql Database that I have already created. This is my configuration file:
<?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>
This is my AbitazioneDB class (I will omitt getters and setters):
@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;
}
}
This is my HibernateUtil class:
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;
}
}
And this is my TestHibernate class, with the main
method:
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!");
}
}
When I run TestHibernate I always get that exception and I have no idea why. Maybe I should change the connection.pool_size
property, but if I do so it seems that I only get more errors. Can someone help me?
The Hibernate Connection Pool Size property establishes the number of connections that are permitted between the Model repository and the Model Repository Service database. The default value is 10. In deployments with many concurrent connections, you can increase the property to increase performance.
Hibernate will use its org. hibernate. connection. C3P0ConnectionProvider for connection pooling if you set hibernate.
Behind the scenes, the connection pool gives a logical transaction which, when being closed, it returns back to the pool so that it can be further reused by other concurrent transactions. A connection leak happens when a connection is acquired without ever being closed.
Try this :
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;
}
And instead of using SessionFactory use Session:
final Session session = HibernateUtil.getHibernateSession();
And then use:
Transaction tx = session.beginTransaction();
// all your methods
tx.commit();
session.close();
Hope this helps.
And you can actually not have that connection pool property in your hbm if you don't need it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With