Spring + Hibernate с транзакциями в многопоточной среде - PullRequest
0 голосов
/ 25 января 2012

У меня есть простое приложение, которое выбирает некоторые данные из ОДНОЙ таблицы в БД (MySQL 5.1) через Hibernate и отображает содержимое. Основным используемым фреймворком является Spring 3.0. Запрос выполняется правильно в @Transactional (только для чтения) (+ второй уровень кэша). Проблемы возникают при выполнении нескольких параллельных тестов с запросами 20/30 на одну и ту же страницу. Некоторые запросы страниц возвращают 500 вместо 200. Я полагаю, это связано с тем, что @Transactional не управляет многопоточным доступом (пожалуйста, исправьте меня, если я ошибаюсь).

В контроллере у меня что-то вроде этого:

List<String> names = usersService.getUserNames(); // this executes query in @Transactional env
doSomething(names);

В журналах указано, что doSomething создает некоторое исключение NullPointerException, так как в переданном списке нет данных.

Есть ли способ реализовать диспетчер доступа с несколькими потоками в Spring + Hibernate, который управляет параллельными запросами к БД?

Ответы [ 2 ]

1 голос
/ 26 января 2012

@ Transactional отлично работает в многопоточных приложениях. Фактически, все веб-приложения являются многопоточными, и каждый экземпляр синглтона Spring Bean обрабатывает все запросы. Так что проблема не в этом.

Когда вы получаете ошибку 500, вы должны проверить файлы журналов. Если там ничего нет, убедитесь, что вы не проглотили какое-то исключение.

1 голос
/ 26 января 2012

Необходимо убедиться, что для каждого входящего запроса выделено отдельное соединение с базой данных. Соединения должны управляться в пуле. Размер пула соединений с базой данных будет (косвенно) определять, сколько запросов может одновременно обрабатывать ваше приложение.

...