Nhibernate + Spring.Net + Транзакция + слишком много потоков - PullRequest
3 голосов
/ 28 февраля 2011

Я использую Sping.Net 1.3.1 и Nhibernate 3.0. Я использую Spring Transaction Interceptor для создания моих транзакций. Я отмечаю свои транзакционные методы с помощью атрибута транзакции. Мой сервер получает примерно 20-25 запросов в секунду, каждый запрос обрабатывается в новом потоке с использованием параллельной задачи. Я запускаю стресс-тест, чтобы проверить способность моего сервера обрабатывать вызовы. когда я запускаю только два или три вызова за раз, все работает отлично, , но когда я выполняю 5-10 вызовов одновременно, я получаю исключение из Spring.

Исключение составляет:

Spring.Transaction.TransactionSystemException was unhandled by user code
Message=Could not commit Hibernate transaction
Source=Spring.Data.NHibernate30
StackTrace:
  at Spring.Data.NHibernate.HibernateTransactionManager.DoCommit(DefaultTransactionStatus status) in c:\_svn\spring-net\tags\spring-net-1.3.1\src\Spring\Spring.Data.NHibernate\Data\NHibernate\HibernateTransactionManager.cs:line 568
  at Spring.Transaction.Support.AbstractPlatformTransactionManager.ProcessCommit(DefaultTransactionStatus status)

InnerException: NHibernate.TransactionException
  Message=Transaction not connected, or was disconnected
  Source=NHibernate
  StackTrace:
    at NHibernate.Transaction.AdoTransaction.CheckNotZombied() in d:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:line 408
    at NHibernate.Transaction.AdoTransaction.Commit() in d:\CSharp\NH\nhibernate\src\NHibernate\Transaction\AdoTransaction.cs:line 181
    at Spring.Data.NHibernate.HibernateTransactionManager.DoCommit(DefaultTransactionStatus status) in c:\_svn\spring-net\tags\spring-net-1.3.1\src\Spring\Spring.Data.NHibernate\Data\NHibernate\HibernateTransactionManager.cs:line 556
   InnerException: 

Большое спасибо, Или чубук.

1 Ответ

3 голосов
/ 09 декабря 2011

Я уверен, что вы уже нашли этот ответ к настоящему времени. Когда вы разделяете сеанс NHibernate между несколькими потоками, вы столкнетесь с этой проблемой параллелизма. Каждый поток должен иметь свой собственный сеанс в области видимости, чтобы избежать состояния отключения транзакции.

...