Слишком много подключений в Hibernate - PullRequest
2 голосов
/ 19 ноября 2011

Я пытаюсь выучить 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: сессия уже закрыта

Так как решить проблему?

1 Ответ

8 голосов
/ 19 ноября 2011

Проблема не в Session с и транзакциях, а в SessionFactory. Вы создаете новый SessionFactory на каждой итерации и не закрываете его.

Обычно вам требуется только один экземпляр SessionFactory для каждого приложения, поэтому вы должны создать его вне цикла и явно закрыть, когда ваше приложение остановится.

Получение Session с и работа с транзакциями внутри цикла корректна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...