Error connection leak detected there are 1 unclosed connections upon shutting down pool jdbc

I am new to Java/Hibernate and I have no idea what this error means. ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/

I am new to Java/Hibernate and I have no idea what this error means.

ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/hb_student_records?useSSL=false&serverTimezone=UTC
Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available!

I looked up answers on other forums from Stack Overflow but nothing made sense to me there.

My classes are here as follows:

Create Student Demo

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();
        }
    }

}

Student.java

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 + "]";
    }

}

And my config.xml file

hibernate.cfg.xml

<!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>

        <!-- JDBC Database connection settings -->
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hb_student_records?useSSL=false&amp;serverTimezone=UTC</property>
        <property name="connection.username">hbstudent</property>
        <property name="connection.password">hbstudent</property>

        <!-- JDBC connection pool settings ... using built-in test pool -->
        <property name="connection.pool_size">1</property>

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

        <!-- Echo the SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Set the current session context -->
        <property name="current_session_context_class">thread</property>

    </session-factory>

</hibernate-configuration>

I don’t know what’s causing my open connection as I have closed my factory in the class and the session is temporary.

Ошибка Java / Hibernate: обнаружена утечка соединения. Внутренний пул соединений достиг максимального размера, и в настоящее время нет доступных соединений.

Я новичок в Java / Hibernate и понятия не имею, что означает эта ошибка.

Я искал ответы на других форумах от Stack Overflow, но там для меня ничего не имело смысла.

Мои классы здесь следующие:

Создать студенческую демонстрацию

Student.java

И мой файл config.xml

hibernate.cfg.xml

Я не знаю, что вызывает мое открытое соединение, поскольку я закрыл свою фабрику в классе, и сеанс является временным.

Я думаю, вам также следует очистить и закрыть объект сеанса перед закрытием объекта factory.

Используйте ниже в своем классе сущности @GeneratedValue (стратегия = GenerationType.IDENTITY)

Добро пожаловать в Stack Overflow! Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно как и / или Зачем, он решает проблему, что улучшит долгосрочную ценность ответа.

Быстрый способ решения этой проблемы — заменить последние пакеты Hibernate старыми файлами jar Hibernate 5.2.

На самом деле проблема не в пуле соединений, есть некоторое несоответствие типа объекта в блоке try и catch, вы можете удалить блок try и catch и посмотреть, что такое настоящее исключение.

Наверное, на это смогут ответить специалисты Hibernate.

И, конечно же, «очистка и закрытие объекта сеанса перед закрытием объекта фабрики» вам не поможет.

В классе учеников в строке № 14 вы объявили стратегию генерации идентификатора как:

Измените это на

Это устранит ошибку.

Посмотрите в Hibernate Docs, чтобы узнать, какой из них поддерживается вашей базой данных. Ниже представлены все 4 стратегии генерации идентификаторов:

Источник

Why is it sending me an unclosed connection error when everything should be clean?

I have a basic one to one mapping. When i try to extract information with the foreign key the first time i run the program i get an error message:ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/novabaza?useSSL=false&serverTimezone=UTC Exception in thread «main» java.lang.NullPointerException at oto_otm_mtm.Blogic.main(Blogic.java:46). Second time i run the progam it always goes smoothly.

Tried to close the session then begin a new one because i thought that the problem is that I’m trying to retrieve data from a base that doesn’t exist. Nothing changed.

1 Answer 1

You are closing the session but you are not closing the established database connection. Hence the connection leak. Please close the database connection. This will resolve the issue.

A titbit is to in your above code, have all your statements within a single transaction.

Linked

Related

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.1.12.43151

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Ошибка Java / Hibernate: обнаружена утечка соединения. Внутренний пул соединений достиг максимального размера, и в настоящее время нет доступных соединений.

Я новичок в Java / Hibernate и понятия не имею, что означает эта ошибка.

Я искал ответы на других форумах от Stack Overflow, но там для меня ничего не имело смысла.

Мои классы здесь следующие:

Создать студенческую демонстрацию

Student.java

И мой файл config.xml

hibernate.cfg.xml

Я не знаю, что вызывает мое открытое соединение, поскольку я закрыл свою фабрику в классе, и сеанс является временным.

Ответы:

Я думаю, вам также следует очистить и закрыть объект сеанса перед закрытием объекта factory.

Используйте ниже в своем классе сущности @GeneratedValue (стратегия = GenerationType.IDENTITY)

Быстрый способ решения этой проблемы — заменить последние пакеты Hibernate старыми файлами jar Hibernate 5.2.

На самом деле проблема не в пуле соединений, есть некоторое несоответствие типа объекта в блоке try и catch, вы можете удалить блок try и catch и посмотреть, что такое настоящее исключение.

Наверное, на это смогут ответить специалисты Hibernate.

И, конечно же, «очистка и закрытие объекта сеанса перед закрытием объекта фабрики» вам не поможет.

В классе учеников в строке № 14 вы объявили стратегию генерации идентификатора как:

Измените это на

Это устранит ошибку.

Посмотрите в Hibernate Docs, чтобы узнать, какой из них поддерживается вашей базой данных. Ниже представлены все 4 стратегии генерации идентификаторов:

Источник

Ошибка Java / Hibernate: обнаружена утечка соединения. Внутренний пул соединений достиг своего максимального размера, и в настоящее время нет доступных соединений

Я новичок в Java / Hibernate, и я понятия не имею, что означает эта ошибка.

Я искал ответы на других форумах от Stack Overflow, но там для меня ничего не имело смысла.

Мои занятия здесь следующие:

Создать демо-версию для студентов

Student.java

И мой файл config.xml

Я не знаю, что вызывает мое открытое соединение, так как я закрыл свою фабрику в классе, и сеанс является временным.

6 ответов

Я думаю, что вы должны также очистить и закрыть объект сеанса перед закрытием объекта фабрики.

Послушай, у меня есть твои сомнения, см. Убери строку @GenerationType(Strategy=GeneratedValue.Identity) потому что я предполагаю, что вы используете автоинкремент в столбце первичного ключа. @GenerationType(Strategy=GeneratedValue.Identity) следует использовать только тогда, когда вы хотите сохранить в базе данных более одного объекта.

У меня это не сработало 🙁

Используйте ниже в вашем классе сущности @GeneratedValue (стратегии = GenerationType.IDENTITY)

Быстрое решение этой проблемы — заменить последние пакеты Hibernate старыми jar-файлами Hibernate 5.2.

На самом деле проблема не в пуле соединений, есть некоторое несоответствие типов объектов в блоке try и catch, вы можете удалить блок try и catch и посмотреть, что является настоящим исключением.

Вероятно, эксперты Hibernate могут ответить на этот вопрос.

И, конечно, «очистка и закрытие объекта сеанса перед закрытием фабричного объекта» вам не поможет.

Источник

How to avoid java.util.ConcurrentModificationException

I’m using Hibernate in this application. I’m trying call data from database to jTable. When database is empty codes are compiling but when i add data to mysql table program throw java.util.ConcurrentModificationException.

My data access codes. Maybe the problem is here

Somebody can help me? Stack trace:

4 Answers 4

You are replacing the value of books with another list then the loop tries to append the new list books into itself — hence ConcurrentModificationException.

Assuming that getResultList() returns a List all you need to do is append results directly to books without re-assignment:

Try using a CopyOnWriteArrayList instead of an ArrayList . This will allow for concurrent modification. But be warned, if you are changing the list a lot, this is not very efficient. If you are mostly reading, however, it should be fine.

ConcurrentModificationException is being thrown because you are adding elements to the same list you are iterating. Here:

This code is wrong.

You can either return the List instance returned by Hibernate, or create a new list.

You don’t need to use a CopyOnWriteArrayList ! It is a very expensive datastructure. Your error has nothing to do with different threads modifiying and accessing the list at the same time. Besides, you don’t need to start an explicit transaction against the database, because you are only reading. The whole select method could perfectly be simplified to:

You don’t need to close the factory , either.

Источник

Я новичок в Java / Hibernate и понятия не имею, что означает эта ошибка.

ERROR: Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/hb_student_records?useSSL=false&serverTimezone=UTC
Exception in thread "main" org.hibernate.HibernateException: The internal connection pool has reached its maximum size and no connection is currently available!

Я искал ответы на других форумах от Stack Overflow, но там для меня ничего не имело смысла.

Мои классы здесь следующие:

Создать студенческую демонстрацию

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();
        }
    }

}

Student.java

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 + "]";
    }

}

И мой файл config.xml

Hibernate.cfg.xml

<!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>

        <!-- JDBC Database connection settings -->
        <property name = "connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name = "connection.url">jdbc:mysql://localhost:3306/hb_student_records?useSSL=false&amp;serverTimezone=UTC</property>
        <property name = "connection.username">hbstudent</property>
        <property name = "connection.password">hbstudent</property>

        <!-- JDBC connection pool settings ... using built-in test pool -->
        <property name = "connection.pool_size">1</property>

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

        <!-- Echo the SQL to stdout -->
        <property name = "show_sql">true</property>

        <!-- Set the current session context -->
        <property name = "current_session_context_class">thread</property>

    </session-factory>

</hibernate-configuration>

Я не знаю, что вызывает мое открытое соединение, поскольку я закрыл свою фабрику в классе, и сеанс является временным.


Computer, 21 августа 2018 г., 03:39

3

7 510

7

Ответы:

Решено

Я думаю, вам также следует очистить и закрыть объект сеанса перед закрытием объекта factory.


Another, 21 августа 2018 г., 13:02

Используйте ниже в своем классе сущности
@GeneratedValue (стратегия = GenerationType.IDENTITY)


Pragyandipta, 10 июня 2019 г., 10:43

Быстрый способ решения этой проблемы — заменить последние пакеты Hibernate старыми файлами jar Hibernate 5.2.

На самом деле проблема не в пуле соединений, есть некоторое несоответствие типа объекта в блоке try и catch, вы можете удалить блок try и catch и посмотреть, что такое настоящее исключение.

Наверное, на это смогут ответить специалисты Hibernate.

И, конечно же, «очистка и закрытие объекта сеанса перед закрытием объекта фабрики» вам не поможет.


user3148161, 26 июня 2019 г., 14:01

В классе учеников в строке № 14 вы объявили стратегию генерации идентификатора как:

@GeneratedValue(strategy=GenerationType.AUTO)

Измените это на

@GeneratedValue(strategy = GenerationType.IDENTITY)

Это устранит ошибку.

Посмотрите в Hibernate Docs, чтобы узнать, какой из них поддерживается вашей базой данных.
Ниже представлены все 4 стратегии генерации идентификаторов:

  • GenerationType.AUTO: выберите подходящую стратегию для конкретной базы данных.
  • GenerationType.IDENTITY: назначьте первичный ключ, используя столбец идентификаторов базы данных.
  • GenerationType.SEQUENCE: назначьте первичные ключи, используя последовательность базы данных.
  • GenerationType.TABLE: назначьте первичные ключи, используя базовую таблицу базы данных, чтобы гарантировать уникальность.

Nike, 21 сентября 2019 г., 18:47

Послушайте, у меня есть ваши сомнения, посмотрите, удалите строку @GenerationType(Strategy=GeneratedValue.Identity),
потому что я предполагаю, что вы используете автоматическое увеличение в столбце первичного ключа.
@GenerationType(Strategy=GeneratedValue.Identity) следует использовать только тогда, когда вы хотите сохранить более одного объекта в своей базе данных.


SPIDER, 12 ноября 2019 г., 06:23

Ты должен изменить

@GeneratedValue(strategy = GenerationType.AUTO)

К

@GeneratedValue(strategy = GenerationType.IDENTITY)

Тогда это будет работать.


Shaiq_Huseynzade, 22 декабря 2019 г., 22:04

Для меня это решило создание нового EntityManager для каждой транзакции и закрытие его после каждой транзакции.

} finally {
    session.close();
    entityManager.close();
}

B0773N, 26 марта 2021 г., 10:55

Интересные вопросы для изучения

Имею две энтити: Train и Seat. У них есть реляция one-to-many:

UML
введите сюда описание изображения

Train.java:

   @Entity
    @Table(name = "train")
    public class Train {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id")
        private Long id;

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

        // Проблема с реляцией!!!
        @OneToMany(mappedBy = "train", cascade = CascadeType.ALL)
        private Set<Seat> seats;

        @OneToOne
        private State state;

        @Column(name = "carriages")
        private Integer carriages;

        // Getters & Setters...
}

Seat.java:

@Entity
@Table(name = "seat")
public class Seat {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "carriage")
    private Integer carriage;

    @Column(name = "seat")
    private Integer seat;

    // Реляция с поездом
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "train_id", nullable = false)
    private Train train;

    // Getters & Setters...
}

Как можно заметить, связка тут bi-directional:

@OneToMany(mappedBy = "train", cascade = CascadeType.ALL)
    private Set<Seat> seats;

И

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "train_id", nullable = false)
    private Train train;

Собственно говоря, у меня произошла ошибка в бизнес-логике на уровне сервиса, когда я вытаскиваю из расписания JPA Train. Причём, проблемы начинаются лишь тогда, когда я вытаскиваю из поезда список сидений (Seat). В моём Spring MVC приложении вылетает такая ошибка:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.slandshow.models.Train.seats, could not initialize proxy - no Session

Затем, когда я понял первоисточник проблемы, решил дебажить в мейне эти два энтити.

С помощью SessionFactory я решил вытащить из БД поезд под конкретным айдишником записи и посмотреть:

session.beginTransaction();

Train train = session.get(Train.class, 5l); // Вытаскиваю поезд из базы
System.out.println(train); // Причина ошибки вылезает в переопределённом методе toString

session.getTransaction().commit();

Так как у меня toString переопределён, то я хватаю вот такой стек-трейс:

ERROR   2018-09-21 19:42:44,671 [main] org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl  - Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/RattlerStation
Exception in thread "main" java.lang.StackOverflowError
    at java.lang.Long.toString(Long.java:396)
    at java.lang.Long.toString(Long.java:1032)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Train.toString(Train.java:74)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.slandshow.models.Seat.toString(Seat.java:72)
    at java.lang.String.valueOf(String.java:2994)

Когда я просто вывожу другие поля Train’а — то всё ок, проблему Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/RattlerStation вызывает именно train.getSeats();

Вот мой Hibernate конфи, просто вдруг дело в нём

 @Configuration
    @EnableTransactionManagement
    @ComponentScan({"com.slandshow"})
    @PropertySource(value = {"classpath:application.properties"})
    public class HibernateConfig {
        private static final String MODEL_PACKAGE = "com.slandshow.models";
        private static final String JDBC_DRIVER_CLASS_NAME_PROPERTY = "jdbc.driverClassName";
        private static final String JDBC_URL_PROPERTY = "jdbc.url";
        private static final String HIBERNATE_DIALECT_PROPERTY = "hibernate.dialect";
        private static final String HIBERNATE_SHOW_SQL_PROPERTY = "hibernate.show_sql";
        private static final String HIBERNATE_FORMAT_SQL_PROPERTY = "hibernate.format_sql";


        @Autowired
        private Environment environment;

        @Bean
        public LocalSessionFactoryBean sessionFactory() {
            LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
            sessionFactory.setDataSource(dataSource());
            sessionFactory.setPackagesToScan(MODEL_PACKAGE);
            sessionFactory.setHibernateProperties(hibernateProperties());
            Properties property = new Properties();
            property.put("hibernate.id.new_generator_mappings", "false");
            sessionFactory.setHibernateProperties(property);
            return sessionFactory;
        }

        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(environment.getRequiredProperty(JDBC_DRIVER_CLASS_NAME_PROPERTY));
            dataSource.setUrl(environment.getRequiredProperty(JDBC_URL_PROPERTY));
            dataSource.setUsername("root");
            dataSource.setPassword("12345");
            return dataSource;
        }

        private Properties hibernateProperties() {
            Properties properties = new Properties();
            properties.put(HIBERNATE_DIALECT_PROPERTY, environment.getRequiredProperty(HIBERNATE_DIALECT_PROPERTY));
            properties.put(HIBERNATE_SHOW_SQL_PROPERTY, environment.getRequiredProperty(HIBERNATE_SHOW_SQL_PROPERTY));
            properties.put(HIBERNATE_FORMAT_SQL_PROPERTY, environment.getRequiredProperty(HIBERNATE_FORMAT_SQL_PROPERTY));
            return properties;
        }

        @Bean
        @Autowired
        public HibernateTransactionManager transactionManager(SessionFactory s) {
            HibernateTransactionManager txManager = new HibernateTransactionManager();
            txManager.setSessionFactory(s);
            return txManager;
        }

    }

Что же я сделал не так?

I have two enthys: Train and Seat♪ They have one-to-many relay:

UML
введите сюда описание изображения

Train.java:

   @Entity
    @Table(name = "train")
    public class Train {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

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

    // Проблема с реляцией!!!
    @OneToMany(mappedBy = "train", cascade = CascadeType.ALL)
    private Set&lt;Seat&gt; seats;

    @OneToOne
    private State state;

    @Column(name = "carriages")
    private Integer carriages;

    // Getters &amp; Setters...

}

Seat.java:

@Entity
@Table(name = "seat")
public class Seat {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "carriage")
private Integer carriage;

@Column(name = "seat")
private Integer seat;

// Реляция с поездом
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "train_id", nullable = false)
private Train train;

// Getters &amp; Setters...

}

As you can see, the connection is here. bi-directional:

@OneToMany(mappedBy = "train", cascade = CascadeType.ALL)
private Set<Seat> seats;

And

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "train_id", nullable = false)
private Train train;

As a matter of fact, I had a mistake in the business logic at the service level when I pulled out of JPA Train. Besides, the problem starts only when I pull the seat list from the train. In my Spring MVC, the annex is making such a mistake:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.slandshow.models.Train.seats, could not initialize proxy - no Session

Then, when I realized the problem’s original source, I decided to dump these two enthys in the mein.

With help SessionFactory I’ve decided to get out of the OBD train under a specific I.D. and watch:

session.beginTransaction();

Train train = session.get(Train.class, 5l); // Вытаскиваю поезд из базы
System.out.println(train); // Причина ошибки вылезает в переопределённом методе toString

session.getTransaction().commit();

Because I have toString I’m redesigning, so I’m grabbing this kind of thing:

ERROR   2018-09-21 19:42:44,671 [main] org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl  - Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/RattlerStation
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Long.toString(Long.java:396)
at java.lang.Long.toString(Long.java:1032)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at java.util.AbstractCollection.toString(AbstractCollection.java:462)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:303)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Train.toString(Train.java:74)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at com.slandshow.models.Seat.toString(Seat.java:72)
at java.lang.String.valueOf(String.java:2994)

When I’m just taking out the other fields of Train’a, all right, problem. Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:mysql://localhost:3306/RattlerStation Exactly. train.getSeats();

Here’s my Hibernate Confi, just suddenly it’s about him.

 @Configuration
@EnableTransactionManagement
@ComponentScan({"com.slandshow"})
@PropertySource(value = {"classpath:application.properties"})
public class HibernateConfig {
private static final String MODEL_PACKAGE = "com.slandshow.models";
private static final String JDBC_DRIVER_CLASS_NAME_PROPERTY = "jdbc.driverClassName";
private static final String JDBC_URL_PROPERTY = "jdbc.url";
private static final String HIBERNATE_DIALECT_PROPERTY = "hibernate.dialect";
private static final String HIBERNATE_SHOW_SQL_PROPERTY = "hibernate.show_sql";
private static final String HIBERNATE_FORMAT_SQL_PROPERTY = "hibernate.format_sql";
    @Autowired
    private Environment environment;

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(MODEL_PACKAGE);
        sessionFactory.setHibernateProperties(hibernateProperties());
        Properties property = new Properties();
        property.put("hibernate.id.new_generator_mappings", "false");
        sessionFactory.setHibernateProperties(property);
        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty(JDBC_DRIVER_CLASS_NAME_PROPERTY));
        dataSource.setUrl(environment.getRequiredProperty(JDBC_URL_PROPERTY));
        dataSource.setUsername("root");
        dataSource.setPassword("12345");
        return dataSource;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put(HIBERNATE_DIALECT_PROPERTY, environment.getRequiredProperty(HIBERNATE_DIALECT_PROPERTY));
        properties.put(HIBERNATE_SHOW_SQL_PROPERTY, environment.getRequiredProperty(HIBERNATE_SHOW_SQL_PROPERTY));
        properties.put(HIBERNATE_FORMAT_SQL_PROPERTY, environment.getRequiredProperty(HIBERNATE_FORMAT_SQL_PROPERTY));
        return properties;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory s) {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(s);
        return txManager;
    }

}

What did I do wrong?

/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.engine.jdbc.connections.internal; import java.security.AccessController; import java.security.PrivilegedAction; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Enumeration; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.hibernate.HibernateException; import org.hibernate.Internal; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Database; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.internal.util.securitymanager.SystemSecurityManager; import org.hibernate.service.UnknownUnwrapTypeException; import org.hibernate.service.spi.Configurable; import org.hibernate.service.spi.ServiceException; import org.hibernate.service.spi.ServiceRegistryAwareService; import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.Stoppable; import static org.hibernate.internal.log.ConnectionPoolingLogger.CONNECTIONS_LOGGER; import static org.hibernate.internal.log.ConnectionPoolingLogger.CONNECTIONS_MESSAGE_LOGGER; /** * A connection provider that uses the {@link DriverManager} directly to open connections and provides * a very rudimentary connection pool. * * @implNote Not intended for use in production systems! * * @author Gavin King * @author Steve Ebersole */ public class DriverManagerConnectionProviderImpl implements ConnectionProvider, Configurable, Stoppable, ServiceRegistryAwareService, ConnectionValidator { //Thanks to Oleg Varaksin and his article on object pooling using the {@link java.util.concurrent} //package, from which much of the pooling code here is derived. //See http://ovaraksin.blogspot.com/2013/08/simple-and-lightweight-pool.html public static final String MIN_SIZE = «hibernate.connection.min_pool_size»; public static final String INITIAL_SIZE = «hibernate.connection.initial_pool_size»; // in TimeUnit.SECONDS public static final String VALIDATION_INTERVAL = «hibernate.connection.pool_validation_interval»; public static final String INIT_SQL =«hibernate.connection.init_sql»; public static final String CONNECTION_CREATOR_FACTORY =«hibernate.connection.creator_factory_class»; private volatile PoolState state; // create the pool ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ private volatile ServiceRegistryImplementor serviceRegistry; @Override public void injectServices(ServiceRegistryImplementor serviceRegistry) { this.serviceRegistry = serviceRegistry; } @Override public void configure(Map<String, Object> configurationValues) { CONNECTIONS_MESSAGE_LOGGER.usingHibernateBuiltInConnectionPool(); PooledConnections pool = buildPool( configurationValues, serviceRegistry ); final long validationInterval = ConfigurationHelper.getLong( VALIDATION_INTERVAL, configurationValues, 30 ); this.state = new PoolState( pool, validationInterval ); } private PooledConnections buildPool(Map<String,Object> configurationValues, ServiceRegistryImplementor serviceRegistry) { final boolean autoCommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues, false ); final int minSize = ConfigurationHelper.getInt( MIN_SIZE, configurationValues, 1 ); final int maxSize = ConfigurationHelper.getInt( AvailableSettings.POOL_SIZE, configurationValues, 20 ); final int initialSize = ConfigurationHelper.getInt( INITIAL_SIZE, configurationValues, minSize ); ConnectionCreator connectionCreator = buildCreator( configurationValues, serviceRegistry ); PooledConnections.Builder pooledConnectionBuilder = new PooledConnections.Builder( connectionCreator, autoCommit ); pooledConnectionBuilder.initialSize( initialSize ); pooledConnectionBuilder.minSize( minSize ); pooledConnectionBuilder.maxSize( maxSize ); pooledConnectionBuilder.validator( this ); return pooledConnectionBuilder.build(); } private static ConnectionCreator buildCreator(Map<String,Object> configurationValues, ServiceRegistryImplementor serviceRegistry) { final String url = (String) configurationValues.get( AvailableSettings.URL ); String driverClassName = (String) configurationValues.get( AvailableSettings.DRIVER ); boolean success = false; Driver driver = null; if ( driverClassName != null ) { driver = loadDriverIfPossible( driverClassName, serviceRegistry ); success = true; } else if ( url != null ) { //try to guess the driver class from the JDBC URL for ( Database database: Database.values() ) { if ( database.matchesUrl( url ) ) { driverClassName = database.getDriverClassName( url ); if ( driverClassName != null ) { try { loadDriverIfPossible(driverClassName, serviceRegistry); success = true; } catch (Exception e) { //swallow it, since this was not //an explicit setting by the user } break; } } } } if ( success ) { CONNECTIONS_MESSAGE_LOGGER.loadedDriver( driverClassName ); } else { //we’re hoping that the driver is already loaded CONNECTIONS_MESSAGE_LOGGER.noDriver( AvailableSettings.DRIVER ); StringBuilder list = new StringBuilder(); Enumeration<Driver> drivers = DriverManager.getDrivers(); while ( drivers.hasMoreElements() ) { if ( list.length() != 0) { list.append(«, «); } list.append( drivers.nextElement().getClass().getName() ); } CONNECTIONS_MESSAGE_LOGGER.loadedDrivers( list.toString() ); } if ( url == null ) { final String msg = CONNECTIONS_MESSAGE_LOGGER.jdbcUrlNotSpecified( AvailableSettings.URL ); CONNECTIONS_LOGGER.error( msg ); throw new HibernateException( msg ); } CONNECTIONS_MESSAGE_LOGGER.usingUrl( url ); final Properties connectionProps = ConnectionProviderInitiator.getConnectionProperties( configurationValues ); // if debug level is enabled, then log the password, otherwise mask it if ( CONNECTIONS_LOGGER.isDebugEnabled() ) { CONNECTIONS_MESSAGE_LOGGER.connectionProperties( connectionProps ); } else { CONNECTIONS_MESSAGE_LOGGER.connectionProperties( ConfigurationHelper.maskOut( connectionProps, «password» ) ); } final boolean autoCommit = ConfigurationHelper.getBoolean( AvailableSettings.AUTOCOMMIT, configurationValues, false ); CONNECTIONS_MESSAGE_LOGGER.autoCommitMode( autoCommit ); final Integer isolation = ConnectionProviderInitiator.extractIsolation( configurationValues ); if ( isolation != null ) { CONNECTIONS_MESSAGE_LOGGER.jdbcIsolationLevel( ConnectionProviderInitiator.toIsolationNiceName( isolation ) ); } final String initSql = (String) configurationValues.get( INIT_SQL ); final Object connectionCreatorFactory = configurationValues.get( CONNECTION_CREATOR_FACTORY ); ConnectionCreatorFactory factory = null; if ( connectionCreatorFactory instanceof ConnectionCreatorFactory ) { factory = (ConnectionCreatorFactory) connectionCreatorFactory; } else if ( connectionCreatorFactory != null ) { factory = loadConnectionCreatorFactory( connectionCreatorFactory.toString(), serviceRegistry ); } if ( factory == null ) { factory = ConnectionCreatorFactoryImpl.INSTANCE; } return factory.create( driver, serviceRegistry, url, connectionProps, autoCommit, isolation, initSql, configurationValues ); } private static Driver loadDriverIfPossible(String driverClassName, ServiceRegistryImplementor serviceRegistry) { if ( driverClassName == null ) { CONNECTIONS_LOGGER.debug( «No driver class specified» ); return null; } if ( serviceRegistry != null ) { final ClassLoaderService classLoaderService = serviceRegistry.getService( ClassLoaderService.class ); final Class<Driver> driverClass = classLoaderService.classForName( driverClassName ); try { return driverClass.newInstance(); } catch ( Exception e ) { throw new ServiceException( «Specified JDBC Driver « + driverClassName + » could not be loaded», e ); } } try { return (Driver) Class.forName( driverClassName ).newInstance(); } catch ( Exception e1 ) { throw new ServiceException( «Specified JDBC Driver « + driverClassName + » could not be loaded», e1 ); } } private static ConnectionCreatorFactory loadConnectionCreatorFactory(String connectionCreatorFactoryClassName, ServiceRegistryImplementor serviceRegistry) { if ( connectionCreatorFactoryClassName == null ) { CONNECTIONS_LOGGER.debug( «No connection creator factory class specified» ); return null; } if ( serviceRegistry != null ) { final ClassLoaderService classLoaderService = serviceRegistry.getService( ClassLoaderService.class ); final Class<ConnectionCreatorFactory> factoryClass = classLoaderService.classForName( connectionCreatorFactoryClassName ); try { return factoryClass.newInstance(); } catch ( Exception e ) { throw new ServiceException( «Specified ConnectionCreatorFactory « + connectionCreatorFactoryClassName + » could not be loaded», e ); } } try { return (ConnectionCreatorFactory) Class.forName( connectionCreatorFactoryClassName ).newInstance(); } catch ( Exception e1 ) { throw new ServiceException( «Specified ConnectionCreatorFactory « + connectionCreatorFactoryClassName + » could not be loaded», e1 ); } } // use the pool ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override public Connection getConnection() throws SQLException { if ( state == null ) { throw new IllegalStateException( «Cannot get a connection as the driver manager is not properly initialized» ); } return state.getConnection(); } @Override public void closeConnection(Connection conn) throws SQLException { if ( state == null ) { throw new IllegalStateException( «Cannot close a connection as the driver manager is not properly initialized» ); } state.closeConnection( conn ); } @Override public boolean supportsAggressiveRelease() { return false; } @Override public boolean isUnwrappableAs(Class<?> unwrapType) { return ConnectionProvider.class.equals( unwrapType ) || DriverManagerConnectionProviderImpl.class.isAssignableFrom( unwrapType ); } @Override @SuppressWarnings( {«unchecked»}) public <T> T unwrap(Class<T> unwrapType) { if ( ConnectionProvider.class.equals( unwrapType ) || DriverManagerConnectionProviderImpl.class.isAssignableFrom( unwrapType ) ) { return (T) this; } else { throw new UnknownUnwrapTypeException( unwrapType ); } } protected void validateConnectionsReturned() { int allocationCount = state.pool.allConnections.size() — state.pool.availableConnections.size(); if ( allocationCount != 0 ) { CONNECTIONS_MESSAGE_LOGGER.error( «Connection leak detected: there are « + allocationCount + » unclosed connections»); } } // destroy the pool ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override public void stop() { if ( state != null ) { state.stop(); validateConnectionsReturned(); } } //CHECKSTYLE:START_ALLOW_FINALIZER @Override protected void finalize() throws Throwable { if ( state != null ) { state.stop(); } super.finalize(); } //CHECKSTYLE:END_ALLOW_FINALIZER /** * Exposed to facilitate testing only. */ public Properties getConnectionProperties() { BasicConnectionCreator connectionCreator = (BasicConnectionCreator) this.state.pool.connectionCreator; return connectionCreator.getConnectionProperties(); } @Override public boolean isValid(Connection connection) throws SQLException { return true; } @Internal public void releasePooledConnections() { state.pool.releasePooledConnections(); } public static class PooledConnections { private final ConcurrentLinkedQueue<Connection> allConnections = new ConcurrentLinkedQueue<>(); private final ConcurrentLinkedQueue<Connection> availableConnections = new ConcurrentLinkedQueue<>(); private final ConnectionCreator connectionCreator; private final ConnectionValidator connectionValidator; private final boolean autoCommit; private final int minSize; private final int maxSize; private volatile boolean primed; private PooledConnections( Builder builder) { CONNECTIONS_LOGGER.debugf( «Initializing Connection pool with %s Connections», builder.initialSize ); connectionCreator = builder.connectionCreator; connectionValidator = builder.connectionValidator == null ? ConnectionValidator.ALWAYS_VALID : builder.connectionValidator; autoCommit = builder.autoCommit; maxSize = builder.maxSize; minSize = builder.minSize; CONNECTIONS_MESSAGE_LOGGER.hibernateConnectionPoolSize( maxSize, minSize ); addConnections( builder.initialSize ); } public void validate() { final int size = size(); if ( !primed && size >= minSize ) { // IMPL NOTE : the purpose of primed is to allow the pool to lazily reach its // defined min-size. CONNECTIONS_LOGGER.debug( «Connection pool now considered primed; min-size will be maintained» ); primed = true; } if ( size < minSize && primed ) { int numberToBeAdded = minSizesize; CONNECTIONS_LOGGER.debugf( «Adding %s Connections to the pool», numberToBeAdded ); addConnections( numberToBeAdded ); } else if ( size > maxSize ) { int numberToBeRemoved = sizemaxSize; CONNECTIONS_LOGGER.debugf( «Removing %s Connections from the pool», numberToBeRemoved ); removeConnections( numberToBeRemoved ); } } public void add(Connection conn) throws SQLException { final Connection connection = releaseConnection( conn ); if ( connection != null ) { availableConnections.offer( connection ); } } protected Connection releaseConnection(Connection conn) { Exception t = null; try { conn.setAutoCommit( true ); conn.clearWarnings(); if ( connectionValidator.isValid( conn ) ) { return conn; } } catch (SQLException ex) { t = ex; } closeConnection( conn, t ); CONNECTIONS_MESSAGE_LOGGER.debug( «Connection release failed. Closing pooled connection», t ); return null; } public Connection poll() throws SQLException { Connection conn; do { conn = availableConnections.poll(); if ( conn == null ) { synchronized (allConnections) { if ( allConnections.size() < maxSize ) { addConnections( 1 ); return poll(); } } throw new HibernateException( «The internal connection pool has reached its maximum size and no connection is currently available» ); } conn = prepareConnection( conn ); } while ( conn == null ); return conn; } protected Connection prepareConnection(Connection conn) { Exception t = null; try { conn.setAutoCommit( autoCommit ); if ( connectionValidator.isValid( conn ) ) { return conn; } } catch (SQLException ex) { t = ex; } closeConnection( conn, t ); CONNECTIONS_MESSAGE_LOGGER.debug( «Connection preparation failed. Closing pooled connection», t ); return null; } protected void closeConnection(Connection conn, Throwable t) { try { conn.close(); } catch (SQLException ex) { CONNECTIONS_MESSAGE_LOGGER.unableToCloseConnection( ex ); if ( t != null ) { t.addSuppressed( ex ); } } finally { allConnections.remove( conn ); } } public void close() throws SQLException { try { int allocationCount = allConnections.size() — availableConnections.size(); if(allocationCount > 0) { CONNECTIONS_LOGGER.error( «Connection leak detected: there are « + allocationCount + » unclosed connections upon shutting down pool « + getUrl()); } } finally { for ( Connection connection : allConnections ) { connection.close(); } } } public int size() { return availableConnections.size(); } protected void removeConnections(int numberToBeRemoved) { for ( int i = 0; i < numberToBeRemoved; i++ ) { Connection connection = availableConnections.poll(); try { if ( connection != null ) { connection.close(); } allConnections.remove( connection ); } catch (SQLException e) { CONNECTIONS_MESSAGE_LOGGER.unableToCloseConnection( e ); } } } protected void addConnections(int numberOfConnections) { for ( int i = 0; i < numberOfConnections; i++ ) { Connection connection = connectionCreator.createConnection(); allConnections.add( connection ); availableConnections.add( connection ); } } public String getUrl() { return connectionCreator.getUrl(); } @Internal public void releasePooledConnections() { for ( Connection connection : allConnections ) { closeConnection( connection, null ); } } public static class Builder { private final ConnectionCreator connectionCreator; private ConnectionValidator connectionValidator; private final boolean autoCommit; private int initialSize = 1; private int minSize = 1; private int maxSize = 20; public Builder(ConnectionCreator connectionCreator, boolean autoCommit) { this.connectionCreator = connectionCreator; this.autoCommit = autoCommit; } public Builder initialSize(int initialSize) { this.initialSize = initialSize; return this; } public Builder minSize(int minSize) { this.minSize = minSize; return this; } public Builder maxSize(int maxSize) { this.maxSize = maxSize; return this; } public Builder validator(ConnectionValidator connectionValidator) { this.connectionValidator = connectionValidator; return this; } public PooledConnections build() { return new PooledConnections( this ); } } } private static class PoolState implements Runnable { //Protecting any lifecycle state change: private final ReadWriteLock statelock = new ReentrantReadWriteLock(); private volatile boolean active = false; private ScheduledExecutorService executorService; private final PooledConnections pool; private final long validationInterval; public PoolState(PooledConnections pool, long validationInterval) { this.pool = pool; this.validationInterval = validationInterval; } private void startIfNeeded() { if ( active ) { return; } statelock.writeLock().lock(); try { if ( active ) { return; } executorService = Executors.newSingleThreadScheduledExecutor( new ValidationThreadFactory() ); executorService.scheduleWithFixedDelay( this, validationInterval, validationInterval, TimeUnit.SECONDS ); active = true; } finally { statelock.writeLock().unlock(); } } @Override public void run() { if ( active ) { pool.validate(); } } public void stop() { statelock.writeLock().lock(); try { if ( !active ) { return; } CONNECTIONS_MESSAGE_LOGGER.cleaningUpConnectionPool( pool.getUrl() ); active = false; if ( executorService != null ) { PrivilegedAction delegateToPrivilegedAction = new PrivilegedAction() { @Override public Object run() { executorService.shutdown(); return null; } }; if ( SystemSecurityManager.isSecurityManagerEnabled() ) { AccessController.doPrivileged( delegateToPrivilegedAction ); } else { delegateToPrivilegedAction.run(); } } executorService = null; try { pool.close(); } catch (SQLException e) { CONNECTIONS_MESSAGE_LOGGER.unableToClosePooledConnection( e ); } } finally { statelock.writeLock().unlock(); } } public Connection getConnection() throws SQLException { startIfNeeded(); statelock.readLock().lock(); try { return pool.poll(); } finally { statelock.readLock().unlock(); } } public void closeConnection(Connection conn) throws SQLException { if (conn == null) { return; } startIfNeeded(); statelock.readLock().lock(); try { pool.add( conn ); } finally { statelock.readLock().unlock(); } } } private static class ValidationThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable runnable) { Thread thread = new Thread( runnable ); thread.setDaemon( true ); thread.setName( «Hibernate Connection Pool Validation Thread» ); return thread; } } }

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Error connection failed super bunny man
  • Error connection failed rake
  • Error connection error 401 permission denied invalid pve ticket
  • Error connection closed что делать
  • Error connection closed chrome

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии