title: Java/Hibernate Error: Connection leak detected. The internal connection pool has reached its maximum size and no connection is currently available
body: <p>I am new to Java/Hibernate and I have no idea what this error means. </p>
  
  <pre><code>ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/hb_student_records?useSSL=false&amp;serverTimezone=UTC
  Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available!
  </code></pre>
  
  <p>I looked up answers on other forums from Stack Overflow but nothing made sense to me there. </p>
  
  <p>My classes are here as follows: </p>
  
  <p><strong>Create Student Demo</strong></p>
  
  <pre><code>package com.rsharma.hibernate.demo;
  
  import org.hibernate.Session;
  import org.hibernate.SessionFactory;
  import org.hibernate.cfg.Configuration;
  
  import com.rsharma.hibernate.demo.entity.Student;
  
  public class CreateStudentDemo {
  
      public static void main(String[] args) {
  
          // create session factory
          SessionFactory factory = new Configuration()
                                  .configure("hibernate.cfg.xml")
                                  .addAnnotatedClass(Student.class)
                                  .buildSessionFactory();
  
          // create session
          Session session = factory.getCurrentSession();
  
          try {           
              // create a student object
              System.out.println("Creating new student object...");
              Student tempStudent = new Student("Rishav", "Sharma", "paul@luv2code.com");
  
              // start a transaction
              session.beginTransaction();
  
              // save the student object
              System.out.println("Saving the student...");
              session.save(tempStudent);
  
              // commit transaction
              session.getTransaction().commit();
  
              System.out.println("Done!");
          }
          finally {
              factory.close();
          }
      }
  
  }
  </code></pre>
  
  <p><strong>Student.java</strong> </p>
  
  <pre><code>package com.rsharma.hibernate.demo.entity;
  
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.Table;
  
  @Entity 
  @Table(name="student")
  public class Student {
  
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      @Column(name="id")
      private int id; 
  
      @Column(name="first_name")
      private String firstName; 
  
      @Column(name="last_name")
      private String lastName; 
  
      @Column(name="email")
      private String email; 
  
  
  
      public Student(){ 
  
      }
  
  
      public Student(String firstName, String lastName, String email) {
          this.firstName = firstName;
          this.lastName = lastName;
          this.email = email;
      }
  
  
      public int getId() {
          return id;
      }
  
  
      public void setId(int id) {
          this.id = id;
      }
  
  
      public String getFirstName() {
          return firstName;
      }
  
  
      public void setFirstName(String firstName) {
          this.firstName = firstName;
      }
  
  
      public String getLastName() {
          return lastName;
      }
  
  
      public void setLastName(String lastName) {
          this.lastName = lastName;
      }
  
  
      public String getEmail() {
          return email;
      }
  
  
      public void setEmail(String email) {
          this.email = email;
      }
  
  
      @Override
      public String toString() {
          return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
      }
  
  }
  </code></pre>
  
  <p>And my config.xml file </p>
  
  <p><strong>hibernate.cfg.xml</strong></p>
  
  <pre><code>&lt;!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"&gt;
  
  &lt;hibernate-configuration&gt;
  
      &lt;session-factory&gt;
  
          &lt;!-- JDBC Database connection settings --&gt;
          &lt;property name="connection.driver_class"&gt;com.mysql.cj.jdbc.Driver&lt;/property&gt;
          &lt;property name="connection.url"&gt;jdbc:mysql://localhost:3306/hb_student_records?useSSL=false&amp;amp;serverTimezone=UTC&lt;/property&gt;
          &lt;property name="connection.username"&gt;hbstudent&lt;/property&gt;
          &lt;property name="connection.password"&gt;hbstudent&lt;/property&gt;
  
          &lt;!-- JDBC connection pool settings ... using built-in test pool --&gt;
          &lt;property name="connection.pool_size"&gt;1&lt;/property&gt;
  
          &lt;!-- Select our SQL dialect --&gt;
          &lt;property name="dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
  
          &lt;!-- Echo the SQL to stdout --&gt;
          &lt;property name="show_sql"&gt;true&lt;/property&gt;
  
          &lt;!-- Set the current session context --&gt;
          &lt;property name="current_session_context_class"&gt;thread&lt;/property&gt;
  
      &lt;/session-factory&gt;
  
  &lt;/hibernate-configuration&gt;
  </code></pre>
  
  <p>I don't know what's causing my open connection as I have closed my factory in the class and the session is temporary. </p>