【问题标题】:Getting HibernateException : The internal connection pool has reached its maximum size and no connection is currently available获取 HibernateException :内部连接池已达到其最大大小,当前没有可用的连接
【发布时间】:2020-03-09 13:48:13
【问题描述】:

我收到 org.hibernate.HibernateException:内部连接池已达到其最大大小,当前没有可用的连接!我相信问题是由于不正确的会话处理。任何人都可以提出正确的方法吗?

这是我的服务类。

@Service
public class DataService {

    @Autowired
    private SessionFactory sessionFactory;

    public User createUser(User newUser) {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(newUser);
        session.getTransaction().commit();
        session.close();
        return newUser;
    }

    public User findUser(UUID userId) {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        try {
            return session.get(User.class, userId);
        } finally {
            session.close();
        }
    }
}

下面是我的休眠配置。我认为我的配置是正确的。我的 Session 实例化和关闭服务类是错误的。

<!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>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/rest_database?useSSL=false</property>
        <property name="connection.username">admin</property>
        <property name="connection.password">admin</property>

        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="show_sql">true</property>
        <property name="current_session_context_class">thread</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.dbcp.initialSize">5</property>
        <property name="hibernate.dbcp.maxTotal">20</property>
        <property name="hibernate.dbcp.maxIdle">10</property>
        <property name="hibernate.dbcp.minIdle">5</property>
        <property name="hibernate.dbcp.maxWaitMillis">-1</property>

        <mapping class="com.in.models.User" />
    </session-factory>

</hibernate-configuration>

【问题讨论】:

  • 您似乎没有在 DataService 中关闭会话,因此您可能会用完连接。
  • @locus2k 我更新了课程,但仍然遇到同样的错误。我有一个连接到我的数据库的数据库查询浏览器,所以在我的配置中只有 1 个允许连接并且查询浏览器已经连接。是不是因为这个,连接用完了?
  • 您的池大小为 1。如果createUser 出现错误,您的代码也存在缺陷,您正在泄漏会话并因此连接。

标签: java spring hibernate jpa jdbc


【解决方案1】:

在我的 hibernate.cfg.xml 中,连接池大小为 1。

<property name="connection.pool_size">1</property>

我的数据库查询浏览器(DBeaver)已经连接到我的数据库,因此当我试图保存对象时,它给出了休眠异常 - 没有可用的连接。

当我在 hibernate.cfg.xml 中将连接池大小增加到 2。异常得到解决,因为数据库允许 2 个连接。

<property name="connection.pool_size">2</property>

【讨论】:

  • 好收获。一个警告。 Hiberates connection.pool_size 根据自己的api不应该在生产环境中使用。应该删除该值并使用您已经在配置中引用的 dbcp 之类的第 3 方。 docs.jboss.org/hibernate/orm/3.3/reference/en/html/…
  • 您的应用程序的连接池大小与 DBeaver 无关。正在连接的 DBeaver 不会从应用程序的连接池中租用连接。
猜你喜欢
  • 2016-12-22
  • 2019-01-27
  • 2016-12-23
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
相关资源
最近更新 更多