Я пытаюсь выучить Hibernate, и я написал простейшую сущность Person, и я пытался вставить 2000 из них.Я знаю, что использую устаревшие методы, позже я попытаюсь выяснить, какие новые.
Во-первых, вот класс Person:
@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: сессия уже закрыта
Так как решить проблему?