postgresql 已经有太多连接

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5232138/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-20 22:53:16  来源:igfitidea点击:

Too many connection already

postgresql

提问by Rishi Kolvekar

I am connecting to a remote postgres(version 9.0) database using hibernate. i get following error

我正在使用休眠连接到远程 postgres(9.0 版)数据库。我收到以下错误

2011-03-08 06:48:25,695 ERROR [org.hibernate.util.JDBCExceptionReporter] (http-69.89.2.245-8080-9) FATAL: sorry, too many clients already
2011-03-08 06:48:25,695 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/JBOSSINI].[com.java.misc.feedback]] (http-69.89.2.245-8080-9) Servlet.service() for servlet com.java.misc.feedback threw exception: java.lang.NullPointerException
    at com.java.model.HiberEx.InsertsimpleReport(HiberEx.java:95) [:]
    at com.java.misc.feedback.doGet(feedback.java:87) [:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [:1.0.0.Final]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.0.0.Final]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.0.0.Final]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [:6.0.0.Final]
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.0.0.Final]
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final]
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final]
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.0.0.Final]
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.0.0.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [:6.0.0.Final]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.0.0.Final]
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.0.0.Final]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.0.0.Final]
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.0.0.Final]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.0.0.Final]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.0.0.Final]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.0.0.Final]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.0.0.Final]
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_21]

this my code

这是我的代码

public void InsertfailReport(String destination, 
                String source,
                String status,
                String timedate, String smsc,
                String failreason,
                String smsid,
                String message){
                SessionFactory sessionFactory = new Configuration().configure("com/java/hibernate.cfg.xml").buildSessionFactory();
                Session session = sessionFactory.openSession();
                Transaction transaction = null;

                try {
                    transaction = session.beginTransaction();
                    Failreport sobj=new Failreport();
                    sobj.setDestination(destination);
                    sobj.setFailreason(failreason);
                    sobj.setMessage(message);
                    sobj.setSmsc(smsc);
                    sobj.setSmsid(smsid);
                    sobj.setSource(source);
                    sobj.setStatus(status);
                    sobj.setTimedate(timedate);
                    session.save(sobj);
                    transaction.commit();
                } catch (HibernateException e) {
                    transaction.rollback();
                    e.printStackTrace();
                } finally {
                    session.close();
                }
        }

Hibernate.cfg.xml

休眠文件.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="MyFactory">
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">xxxx</property>
        <property name="hibernate.connection.url">jdbc:postgresql://xx.xx.xx.xx:5432/smslog</property>
        <property name="hibernate.connection.username">xxxxx</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.validator.apply_to_ddl">false</property>
        <property name="hibernate.validator.autoregister_listeners">false</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.jdbc.batch_size">0</property>
          <mapping resource="com/java/model/Kannel.hbm.xml"/>
          <mapping resource="com/java/model/Smsc.hbm.xml"/>
          <mapping resource="com/java/model/Dlr.hbm.xml"/>
          <mapping resource="com/java/model/Routesmsc.hbm.xml"/>
          <mapping resource="com/java/model/Simplereport.hbm.xml"/>
          <mapping resource="com/java/model/Failreport.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

回答by a_horse_with_no_name

You are exceeding the number of maximum connections configured for your PostgreSQL server.

您超出了为 PostgreSQL 服务器配置的最大连接数。

So you either have your server configured incorrectly to allow not enough connections or you are not closing your connections properly.

因此,您要么错误地配置了服务器以允许没有足够的连接,要么您没有正确关闭连接。

If you are absolutely sure you are closing your connections, I would strongly suggest you use a connection pool to limit the maximum number of concurrent sessions.

如果您绝对确定要关闭连接,我强烈建议您使用连接池来限制并发会话的最大数量。

Alternatively you can change the PostgreSQL configuration and increase the number of allowed connections. See the manual for details:

或者,您可以更改 PostgreSQL 配置并增加允许的连接数。详情请参阅手册:

http://www.postgresql.org/docs/current/static/runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SETTINGS

http://www.postgresql.org/docs/current/static/runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SETTINGS

回答by araqnid

You're creating a new session factory inside the method call which is almost definitely a bad idea- session factories should be considered global shared resources, just like datasources. Not to mention, creating a session factory takes considerable time.

您正在方法调用中创建一个新的会话工厂,这几乎绝对是一个坏主意 - 会话工厂应该被视为全局共享资源,就像数据源一样。更不用说,创建会话工厂需要相当长的时间。

Since you're not closing the session factory, its internal connection pool won't actually be cleared until the session factory itself is GC'd. Typically you create and close session factories during application startup/shutdown (e.g. InitializingBean/DisposableBean, ServletContextEventListener, ServiceMBean)

由于您没有关闭会话工厂,因此在会话工厂本身被 GC 之前,它的内部连接池实际上不会被清除。通常在应用程序启动/关闭期间创建和关闭会话工厂(例如 InitializingBean/DisposableBean、ServletContextEventListener、ServiceMBean)

回答by Mehmet ?zkan YAVUZ

Increase max_connection and shared_buffers

增加 max_connection 和 shared_buffers

in /var/lib/pgsql/data/postgresql.conf

/var/lib/pgsql/data/postgresql.conf

change

改变

max_connections = 100
shared_buffers = 24MB

to

max_connections = 300
shared_buffers = 80MB

and restart PostgreSQL database.

并重启 PostgreSQL 数据库。