简体   繁体   English

已经连接太多了

[英]Too many connection already

I am connecting to a remote postgres(version 9.0) database using hibernate. 我正在使用hibernate连接到远程postgres(版本9.0)数据库。 i get following error 我得到以下错误

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 的hibernate.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>

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. 或者,您可以更改PostgreSQL配置并增加允许的连接数。 See the manual for details: 有关详细信息,请参阅手册

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

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. 由于您没有关闭会话工厂,因此在会话工厂本身为GC之前,实际上不会清除其内部连接池。 Typically you create and close session factories during application startup/shutdown (eg InitializingBean/DisposableBean, ServletContextEventListener, ServiceMBean) 通常,您在应用程序启动/关闭期间创建和关闭会话工厂(例如,InitializingBean / DisposableBean,ServletContextEventListener,ServiceMBean)

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数据库。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM