【问题标题】:Hibernate creates a lot of connectionsHibernate 创建了很多连接
【发布时间】:2020-01-24 21:16:52
【问题描述】:

我使用 Hibernate + Spring Boot,DB 是 MySQL,两天后有很多从 150 到 250 的连接。这是我与实体和 DB 交互的 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


【解决方案1】:

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

【讨论】:

  • 能否给一些方法的代码示例?
  • 从您的问题中不太清楚您在做什么以及开放连接是什么意思。你的意思是停滞的连接?您应该在问题中提供更多详细信息。
  • 我是关于连接处理的,我读到如果我把 openSession() 方法放在 try() 中,它会自动处理
  • 是的,这很好,但有时连接会因为异常和事务失败而无法正确处理而停止。即使您关闭会话,还有一个连接池可以保持连接打开。所以这取决于很多因素。
  • 很抱歉让您担心,但您能举个例子吗
【解决方案2】:

以下是一些示例代码,展示了如何正确处理事务:

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

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 2021-12-13
    • 2019-03-25
    • 2014-07-25
    • 2022-01-20
    • 2021-11-30
    • 2012-07-15
    • 2012-06-14
    • 2015-06-13
    相关资源
    最近更新 更多