2011-11-19 72 views
2

我在學習Hibernate,並且編寫了最簡單的Person Entity,並試圖插入其中的2000個。我知道我正在使用不贊成使用的方法,我會盡量弄清楚以後會發生什麼。休眠中的連接太多

首先,這裏是類人:

@Entity 
public class Person { 

     private int id; 
     private String name; 

     @Id 
     @GeneratedValue(strategy = GenerationType.TABLE, generator = "person") 
     @TableGenerator(name = "person", table = "sequences", allocationSize = 1) 
     public int getId() { 
       return id; 
     } 

     public void setId(int id) { 
       this.id = id; 
     } 

     public String getName() { 
       return name; 
     } 

     public void setName(String name) { 
       this.name = name; 
     } 

} 

然後我寫了插入2000個實體環路一個小應用程序類:

public class App { 

     private static AnnotationConfiguration config; 

     public static void insertPerson() { 
       SessionFactory factory = config.buildSessionFactory(); 
       Session session = factory.getCurrentSession(); 
       session.beginTransaction(); 
       Person aPerson = new Person(); 
       aPerson.setName("John"); 
       session.save(aPerson); 
       session.getTransaction().commit(); 
     } 

     public static void main(String[] args) { 
       config = new AnnotationConfiguration(); 
       config.addAnnotatedClass(Person.class); 
       config.configure("hibernate.cfg.xml"); //is the default already 
       new SchemaExport(config).create(true, true); //print and execute 
       for (int i = 0; i < 2000; i++) { 
         insertPerson(); 
       } 
     } 

} 

什麼了一段時間後,我得到的是:

線程「main」中的異常org.hibernate.exception.JDBCConnectionException:無法打開連接

產生的原因:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:太多的連接

現在我知道,也許如果我把交易的循環會在外面工作,但我是一個測試看看執行多個事務時會發生什麼。而且由於每次只有一個開放,它應該工作。

我試圖在提交之後添加session.close(),但我得到了

異常線程「main」 org.hibernate.SessionException:會話已經關閉

那麼如何解決這個問題?

回答

7

問題不在於Session和交易,而是關於SessionFactory。您在每次迭代中創建一個新的SessionFactory,並且不要關閉它。

通常,每個應用程序只需要SessionFactory的一個實例,以便您應該在循環外部創建它,並在應用程序停止時明確關閉它。

獲取Session s並使用循環內的事務處理是正確的。

+0

太好了,那是問題所在,謝謝。在後見之明後很明顯......所以後來我可以把它變成一個Spring單例,或者在我掌握了hibernate之後,你是否建議我學習[Spring Data](http://www.springsource.org/spring-數據)? – stivlo

+0

@stivlo:是的,在Spring應用程序中,典型的做法是將'SessionFactory'創建爲一個單獨的對象(對於它有一個特殊的'LocalSessionFactoryBean'輔助類)。關於Spring Data,我並不熟悉它。 – axtavt