2013-09-29 7 views
0

У меня есть приложение, которое использует спящий режим для инертных данных в таблицу. База данных - это SQL-сервер. Само приложение развернуто в Tomcat 6. Чтобы вставить данные в таблицу DB - я использую BasicDataSource с минимальными конфигурациями для пула соединений tomcat (например, MaxActive = 150, maxIdle = 10 ....)Вставка данных в таблицу одновременно - спящий режим

Проблема сейчас это - я хочу добавить параллелизм в приложение. В процессе - я делаю одновременные вызовы метода бизнес-уровня, который вызывает методы уровня dao, которые выполняют вставки БД. Это приводит к следующей ошибке:

Exception occurred java.util.concurrent.ExecutionException: org.hibernate.HibernateException: 
Illegal attempt to associate a collection with two open sessions 

Когда я контролировать базу данных, я вижу, что несколько потоков создаются, но не были закрыты.

Я не уверен, как продолжить дальше, чтобы отладить/исправить это. Любые указатели были бы полезны.

+0

Начните с чтения трассировки стека, и понять, что вы делаете в коде, появляющегося в трассировке стека. В ВАШЕМ коде есть ошибка. –

+0

Как вы управляете транзакциями и подключениями к базе данных? – Olaf

ответ

0

Если Hibernate говорит вам:

Illegal attempt to associate a collection with two open sessions 

В основном вы открываете две сессии, и иметь транзакцию, каждый, и вы пытаетесь сохранить сессию в одной транзакции в другую. Конкурентоспособность Ya - главная проблема здесь. Ну, что можно решить, если вы разрабатываете приложение, чтобы тщательно обрабатывать сеансы. Stack-Trace даст вам, какие функции вызывают исключения. Посмотрите, как долго вы работаете с сеансами, и попытайтесь уменьшить их, и убедитесь, что ваши сеансы всегда закрыты после использования.

Приложение, выполненное в спящем режиме, может иметь различные шаблоны.

You need to have session-per-request pattern. In this model, a request from the client is sent to the server, where the Hibernate persistence layer runs. A new Hibernate Session is opened, and all database operations are executed in this unit of work. On completion of the work, and once the response for the client has been prepared, the session is flushed and closed. Use a single database transaction to serve the clients request, starting and committing it when you open and close the Session. The relationship between the two is one-to-one and this model is a perfect fit for many applications

Do not use the anti-patterns session-per-user-session or session-per-application 

Transaction And Concurrency в Hibernate документации дает в анализе глубины и примеры

+0

Благодарим вас за подробный ответ – user811433

Смежные вопросы