Hibernate создает много связей - PullRequest
0 голосов
/ 25 января 2020

Я использую Hibernate + Spring Boot, а БД - MySQL и через два дня у меня много соединений от 150 до 250. Вот мой Бин, который взаимодействует с сущностями и БД. Я думаю, что обработать все исключения и закрыть все соединения

package com.root.lvrmmonitor.utils;

import com.root.lvrmmonitor.entities.*;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DBManager {

    public List<Item> getItemsList() {

        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            return session.createQuery("from Item", Item.class).list();
        }
    }

    public DropTarget saveDropTarget(DropTarget dropTarget) {

        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            Transaction tx = session.beginTransaction();
            session.save(dropTarget);
            tx.commit();
        }

        return dropTarget;
    }

    public void deleteDropTarget(DropTarget dropTarget) {
        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            Transaction tx = session.beginTransaction();
            session.delete(dropTarget);
            tx.commit();
        }
    }

    public void saveSuccess(Success success) {

        try (Session session = HibernateUtil.getSessionFactory().openSession()) {
            Transaction tx = session.beginTransaction();
            session.save(success);
            tx.commit();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вот пример кода, который показывает, как правильно обрабатывать транзакции:

Transaction tx = session.beginTransaction();
try {
    session.save(dropTarget);
    tx.commit();
} catch (RuntimeException e) {
    if (tx.isActive()) tx.rollback();
    throw e;
}

Вы можете создать простую вспомогательную функцию, такую ​​как:

public static <T> T runInTransaction(Session session, Function<Session, T> task) {
  Transaction tx = session.beginTransaction();
  try {
    T res = task(session);
    tx.commit();
    return res;
  } catch (RuntimeException e) {
    if (tx.isActive()) tx.rollback();
    throw e;
  }
}

и использовать ее в своем коде как это:

runInTransaction(session, s -> s.save(dropTarget));
0 голосов
/ 25 января 2020

Вы не обрабатываете исключения вообще в предоставленном классе DBManager.

...