2015-03-08 3 views
3

В моем автономном приложении, генерируя более 1000 потоков за один раз, и каждый поток имеет собственную сессию Hibernate. Но в этом случае количество сеансов попадает на ограничение максимальных подключений базы данных, которое вызывает ошибку.Использование Hibernate с большим количеством потоков

Я попытался установить .getCurrentSession() вместо .openSession(), но это не принесло никакого эффекта, потому что Hibernate открывает новую собственную сессию для каждого нового потока в любом случае.

Как я могу обойти эту проблему? Могу ли я как-то подсчитать количество слотов для параллельных соединений? Напр. пройти 100 соединений и позволить еще 900 ждать, пока эти 100 не будут закрыты, чтобы обработать это дальше?

ответ

3

Использование пула соединений может помочь в решении этой проблемы.

Вот сообщение о создании пула соединений Can you only have one hibernate session per thread in java?

Большинство людей используют пул соединений, как C3P0, которые могут быть использованы для обеспечения повторного сеанса и ускорить ваш код.

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

Вот еще одно сообщение в различных библиотеках объединения пулов.

По умолчанию Hibernate поставляется с возможностью получить реализацию источника данных (javax.sql.DataSource) из JNDI, установив свойства соответственно

hibernate default connection pooling

+0

Да, пул максимальный размер 100 сделал трюк :)) – WildDev

2

Вы можете использовать «ExecutorService» для управления потоками 1000, ограничьте выполнение только 100 потоков, а остальные останутся в очереди.

Однако, я думаю, что это нехорошо иметь так много потоков в вашем приложении. Я предполагаю, что вы работаете над приложением веб-службы и может одновременно иметь 1000 запросов, а старое школьное решение - создать 1000 потоков для их обработки. Но epoll будет только лучше, вы можете рассмотреть некоторые рамки NIO, такие как MINA/Netty.