【问题标题】:JAVA + Postgres Limit connections , how to close it ! FATAL: sorry, too many clients alreadyJAVA+Postgres 限制连接,怎么关闭呢! FATAL:抱歉,已经有太多客户了
【发布时间】:2024-01-22 17:43:01
【问题描述】:

我需要释放与 postgres 的连接

我的 java 应用程序与 postgres 交互,我的问题是当我需要调用此函数超过 200 次 postgres 崩溃时,这是正常的事情......因为 postgres 的连接有限,并且此脚本每次执行时都会打开连接。

@Override
    public Object[] getExtrasInfosSource(int idSource) {
    StringBuffer sql = new StringBuffer();
        final SessionFactoryImplementor sfi = (SessionFactoryImplementor) getSessionFactory();
        final Settings settings = sfi.getSettings();
        // Appel du procedure stocké "getExtrasInfosForSource(idSource integer)" au niveau de bd
        sql.append("SELECT * from "+settings.getDefaultSchemaName()+".getExtras_Infos_For_Source(:idSource)");
        SQLQuery query = this.getSession().createSQLQuery(sql.toString());
        query.setInteger("idSource", idSource);
        return (Object[]) query.setMaxResults(1).uniqueResult();...

你能告诉我如何关闭这个脚本在 postgres 中打开的连接,以避免每次 postgres 连接过载时应用程序崩溃。

【问题讨论】:

  • 在哪里以及如何打开数据库连接?
  • 通过休眠,如果我知道它如何或在哪里打开它,我会在下面的脚本之后立即关闭它,我得到的只是 getSession 并执行打开我想要关闭的连接的查询

标签: java hibernate postgresql connection-pooling release


【解决方案1】:

根据Hibernate's javadocs,您可以在会话中调用.close()

关闭()

通过释放 JDBC 连接并清理来结束会话。

在返回查询结果之前:this.getSession().close();

【讨论】:

  • 感谢您的回复,但这不起作用,我不知道为什么,但 postgres 每次都会保持连接,然后在他的最大连接限制超载后崩溃应用程序
  • WARN JDBCExceptionReporter - SQL 错误:0,SQLState:53300 错误 JDBCExceptionReporter - 致命:d?sol?,trop de clients Sont d?j? connect?s WARN JDBCExceptionReporter - SQL 错误:0,SQLState:53300 错误 JDBCExceptionReporter - FATAL:d?sol?,trop de clients Sont d?j? connect?s ERROR ExceptionMappingInterceptor - 无法为事务打开休眠会话;嵌套异常是 org.hibernate.exception.GenericJDBCException: 无法打开连接
  • 这里是你告诉我的 sql.append("SELECT * from "+settings.getDefaultSchemaName()+".getExtras_Infos_For_Source(:idSource)"); SQLQuery 查询 = this.getSession().createSQLQuery(sql.toString()); query.setInteger("idSource", idSource); this.getSession().close(); Object[] 结果=(Object[]) query.setMaxResults(1).uniqueResult();
  • 在获得结果后尝试关闭会话。
  • 很久没有使用hibernate了,但是你的配置好像有问题。考虑更新您的问题以包含有关如何连接到数据库的更多详细信息。希望有人能看到我没有看到的东西。
【解决方案2】:

我通过将这些变量添加到我的服务器配置中解决了这个问题,它刷新了在 postgresql 中打开的空闲连接(左右)

<?xml version="1.0" encoding="utf-8"?>
<Context>
    <Resource name="jdbc/database"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://localhost:5432/DBA"
              username="DBA"
              password="DBA"
              initialSize="34"
              maxActive="80"
              maxIdle="5"

              timeBetweenEvictionRunsMillis="1000"
              minEvictableIdleTimeMillis="2000"
              validationQuery="SELECT 1"
              validationInterval="3000"
              testOnBorrow="true"
              removeAbandoned="true"
              removeAbandonedTimeout="3"/>  

</Context>

【讨论】: