我使用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();
}
}
}
您在提供的DBManager
类中根本不处理异常。
这里是一些示例代码,显示了如何正确处理事务:
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));