2016-05-24 203 views
0

這是我的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> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.show_sql">true</property> 
     <property name="hibernate.connection.release_mode">after_statement</property> 
     <property name="hibernate.current_session_context_class">thread</property> 
     <property name="hibernate.c3p0.maxPoolSize">5</property> 
     <property name="hibernate.c3p0.maxIdleTime">5</property> 
     <property name="hibernate.c3p0.maxStatements">1</property> 
     <property name="hibernate.c3p0.minPoolSize">1</property> 

     <mapping resource="hbm/Candidati.hbm.xml"/> 
     <mapping resource="hbm/Comune.hbm.xml"/> 
     <mapping resource="hbm/ElezioniComuni.hbm.xml"/> 
     <mapping resource="hbm/Elezioni.hbm.xml"/> 
     <mapping resource="hbm/Liste.hbm.xml"/> 
     <mapping resource="hbm/Seggio.hbm.xml"/> 
     <mapping resource="hbm/Sindaco.hbm.xml"/> 
     <mapping resource="hbm/Utenti.hbm.xml"/> 
     <mapping resource="hbm/UtentiElezioni.hbm.xml"/> 
     <mapping resource="hbm/UtentiSeggio.hbm.xml"/> 
     <mapping resource="hbm/VotiCandidati.hbm.xml"/> 
     <mapping resource="hbm/VotiSindaco.hbm.xml"/> 
     <mapping resource="hbm/Province.hbm.xml"/> 
     <mapping resource="hbm/Regioni.hbm.xml"/> 
     <mapping resource="hbm/VotiListe.hbm.xml"/> 
     <mapping resource="hbm/VotiSpeciali.hbm.xml"/> 
     </session-factory> 

</hibernate-configuration> 

這是我的連接類污物我班

package Service; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpSession; 

import org.apache.struts2.ServletActionContext; 
import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 

public class Connessione { 

    HttpServletRequest request=ServletActionContext.getRequest(); 
    HttpSession session=request.getSession(); 


    SessionFactory factory=(SessionFactory)session.getAttribute("hibernate"); 

    public void connect(){ 

     if(factory==null){ 
      Configuration configuration=new Configuration().configure("hibernate.cfg.xml"); 
      ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
      factory=configuration.buildSessionFactory(serviceRegistry); 
      session.setAttribute("hibernate", factory); 
     } 

    } 

    public SessionFactory getFactory() { 
     return factory; 
    } 

    public void setFactory(SessionFactory factory) { 
     this.factory = factory; 
    } 

} 

方法

public ArrayList<Elezioni> SelectEle(){ 
    conn.connect(); 
    SessionFactory factory = (SessionFactory) session.getAttribute("hibernate"); 
    Session session = factory.openSession(); 

    listaElezioni=new ArrayList<Elezioni>(); 
    listaElezioni =(ArrayList<Elezioni>) session.createQuery("from Elezioni").list(); 
    System.out.println("Taglia:"+listaElezioni.size()); 
    session.close(); 
    return listaElezioni; 
} 

俄勒班取懶加載客戶。

休眠超過1600行的數據庫表

這是問題的20連接創建了過來。

此代碼

<property name="hibernate.c3p0.maxPoolSize">5</property> 
    <property name="hibernate.c3p0.maxIdleTime">5</property> 
    <property name="hibernate.c3p0.maxStatements">1</property> 
    <property name="hibernate.c3p0.minPoolSize">1</property> 

減少連接,但鎖應用的數目。請求休息處於待處理狀態

添加信息。這是Struts2應用程序 我該如何解決這個問題?

回答

0

你做了一件完全不正確的事情。每個HTTP會話都有一個新的會話工廠。你應該有一個SessionFactory完整的應用程序。

HttpServletRequest request = ServletActionContext.getRequest(); 
HttpSession session = request.getSession(); 
SessionFactory factory =(SessionFactory)session.getAttribute("hibernate"); 

if(factory == null){ 

} 

對於每個新用戶,您都有factory == null。所以每個用戶都有自己的SessionFactory連接。

您可以使用ServletContextListener創建並銷燬SessionFactroy

storing Hibernate SessionFactory with Struts

+0

請可yoiu解釋更 – ciro

+0

@ciro我更新。 –

+0

我認爲每個用戶都有他的連接是正確的。問題是休眠不會破壞它們。 你如何看待我應該改變連接類來照你說的去做? 謝謝 – ciro