Может ли транзакция иметь много потоков? - PullRequest
3 голосов
/ 04 декабря 2009

В целом

У нас есть некоторая бизнес-логика, которая вызывает узкое место в транзакции. Бизнес-логика запрашивает у базы данных набор данных (только для чтения), обрабатывает их и возвращает объект. Это должно быть сделано много раз с различными параметрами в данном запросе. Можем ли мы теоретически разорвать каждый вызов бизнес-логики на отдельный поток?

1010 * В частности *

EJB object (part of an http request on a JBoss App Server)
-creates objects that implement Callable (call method calls business logic method)
-using an ExecutorService invoke each callable object

Business Logic
-Makes a query of postgresql database which uses a PreparedStatement
-Using POJOs we build objects from ResultSet objects that come from postgresql
-Do expensive calculations

После всего этого мы получаем ошибки postgres, что неназванные порталы не существуют, даже когда мы ограничиваем наши потоки одним:

ERROR:  cursor "<unnamed portal 777>" does not exist
STATEMENT:  FETCH ALL IN "<unnamed portal 777>"

Я не совсем уверен, что происходит, чтобы вызвать ошибку, но бизнес-логика вызывается правильно, и она отлично работает без потоков. Это приводит меня к вопросу о том, могут ли потоки запускаться и добавляться в транзакцию (и если они могут, как МЫ это делаем?).

Ответы [ 3 ]

3 голосов
/ 04 декабря 2009

Вы не должны создавать потоки в EJB (или где-либо еще в пределах сервера приложений в этом отношении). Если вам нужно разбить его, используйте JMS или, что еще проще, используйте WorkManager , чтобы обеспечить параллелизм внутри операции на основе EJB.

0 голосов
/ 09 декабря 2009

Хотя это, вероятно, не правильный способ сделать что-то, но как это осуществить.

Заставьте объекты, которые реализуют Callable, не просто вызывать бизнес-логику, но выполнять поиск EJB и вызывать метод. Этот результат выглядит так:

EJB object (part of an http request on a JBoss App Server)
-creates objects that implement Callable (call method calls business logic method)
-using an ExecutorService invoke each callable object

Callable Object
-lookup another EJB instance of the class we are already in to get a transaction going
-call that instance's business logic

Business Logic
-Makes a query of postgresql database which uses a PreparedStatement
-Using POJOs we build objects from ResultSet objects that come from postgresql
-Do expensive calculations

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

0 голосов
/ 04 декабря 2009

В контексте JDBC я бы сказал, что если вы можете поделиться соединением, по которому вы выполнили «НАЧАЛО СДЕЛКИ», и выполнить все ваши звонки оттуда, то да, это должно быть хотя бы теоретически работа.

Я обычно не фанат хранимых процедур, но вы рассматривали их? Если потоки внутри транзакции возможны, я ожидаю, что она будет вести себя немного более разумно в ядре базы данных, чем рассредоточена по границе.

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