2011-03-08 77 views
3

我正在使用休眠模式連接到遠程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] 

這是我的代碼

 
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

 
<?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> 

回答

5

您已超出配置爲您的PostgreSQL服務器的最大連接數。

所以你要麼你的服務器配置不正確,以允許沒有足夠的連接,或者你沒有正確關閉你的連接。

如果您確定您正在關閉連接,我強烈建議您使用連接池來限制併發會話的最大數量。

或者,您可以更改PostgreSQL配置並增加允許的連接數。請參閱用戶手冊的細節:

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

4

正在創建的方法調用,它是幾乎可以肯定不好idea-會話工廠應視爲全球共享資源,就像數據源中一個新的會話工廠。更不用說,創建會話工廠需要相當長的時間。

由於您沒有關閉會話工廠,因此它的內部連接池將不會被清除,直到會話工廠本身爲GC'd。通常在應用程序啓動/關閉期間創建和關閉會話工廠(例如InitializingBean/DisposableBean,ServletContextEventListener,ServiceMBean)

+0

+1,非常好的分析。我沒有使用Hibernate,所以我不確定這個用法是否正確。 – 2011-03-08 12:42:06