我在學習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:會話已經關閉
那麼如何解決這個問題?
太好了,那是問題所在,謝謝。在後見之明後很明顯......所以後來我可以把它變成一個Spring單例,或者在我掌握了hibernate之後,你是否建議我學習[Spring Data](http://www.springsource.org/spring-數據)? – stivlo
@stivlo:是的,在Spring應用程序中,典型的做法是將'SessionFactory'創建爲一個單獨的對象(對於它有一個特殊的'LocalSessionFactoryBean'輔助類)。關於Spring Data,我並不熟悉它。 – axtavt