Я новичок в 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&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>
Я не знаю, что вызывает мое открытое соединение, так как я закрыл свою фабрику в классе, и сеанс является временным.
6 ответов
Я думаю, что вы должны также очистить и закрыть объект сеанса перед закрытием объекта фабрики.
Послушай, у меня есть твои сомнения, см. Убери строку @GenerationType(Strategy=GeneratedValue.Identity)
потому что я предполагаю, что вы используете автоинкремент в столбце первичного ключа. @GenerationType(Strategy=GeneratedValue.Identity)
следует использовать только тогда, когда вы хотите сохранить в базе данных более одного объекта.
У меня это не сработало :(
public static void main(String[] args) {
//craete sessionfactory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Student.class).buildSessionFactory();
//craete session
Session session = factory.getCurrentSession();
try {
//use the seesion to save the object
System.out.println("Creating the student object ...");
Student student = new Student("abc","fgh","jklop@gmail.com");
//start the tranction
session.beginTransaction();
//save the student object
System.out.println("Saving the Student...");
session.save(student);
//commit the tranction
session.getTransaction().commit();
System.out.println("Commit Done!!");
}catch(Exception exe) {
session.flush();
session.close();
factory.close();
}
}
Используйте ниже в вашем классе сущности @GeneratedValue (стратегии = GenerationType.IDENTITY)
Быстрое решение этой проблемы - заменить последние пакеты Hibernate старыми jar-файлами Hibernate 5.2.
На самом деле проблема не в пуле соединений, есть некоторое несоответствие типов объектов в блоке try и catch, вы можете удалить блок try и catch и посмотреть, что является настоящим исключением.
Вероятно, эксперты Hibernate могут ответить на этот вопрос.
И, конечно, «очистка и закрытие объекта сеанса перед закрытием фабричного объекта» вам не поможет.
Ты должен изменить
@GeneratedValue(strategy = GenerationType.AUTO)
К
@GeneratedValue(strategy = GenerationType.IDENTITY)
Тогда это будет работать.
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].