2009-12-04 6 views
3

ВообщеМожет ли транзакция иметь много потоков?

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

В частности

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>" 

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

+0

Можете ли вы разбить транзакцию на суб-транзакции? –

+0

Как создаются соединения? Соединение должно использоваться только в одном потоке. –

+0

@Liz Я новичок в транзакциях в целом, так что, может быть, вы можете добавить ответ с некоторой информацией о том, как в него будут вписываться суб-транзакции (нить для каждого? Как это скажется и происходит раньше?) @ Kathy I «Не знаю, что вы подразумеваете под соединением, но ejb является частью запроса на заполнение веб-страницы, а вызов postgres использует PreparedStatement. – Adam

ответ

3

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

+0

Спасибо, Робин, удобная страница, которая появилась в будущем: http: //www.ibm.com/developerworks/java/library/j-jca2/ – Adam

+0

К сожалению, похоже, что Jboss не поддерживает интерфейс WorkManager снаружи, если это управление ресурсами :( – Adam

+0

@Adam - вы можете попробовать это - http: //www.nexopen.org/confluence/display/NXFWK/CommonJ+and+jBoss+integration – Robin

0

В контексте JDBC я бы сказал, что если вы можете поделиться соединением, на котором вы выполнили «НАЧАТЬ ПЕРЕВОД», и выдать все свои звонки оттуда, тогда да, это должно быть как минимум теоретически работают.

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

0

Хотя это, вероятно, не Право Способ делать вещи, вот как это сделать.

Сделайте объекты, которые реализуются. Вызываемые не просто вызовите бизнес-логику, но и выполните поиск 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 

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

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