Hibernate创建了很多连接

问题描述 投票:0回答:2

我使用Hibernate + Spring Boot,数据库是MySQL,两天后从150到250有很多连接。这是与实体和数据库交互的Bean。我想我处理所有异常并关闭所有连接

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();
        }
    }
}
java mysql hibernate spring-boot database-connection
2个回答
0
投票

您在提供的DBManager类中根本不处理异常。


0
投票

这里是一些示例代码,显示了如何正确处理事务:

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));
© www.soinside.com 2019 - 2024. All rights reserved.