2014-03-27 5 views
4

Я написал своего рода тест, который оценивает, как различные комбинации атрибутов транзакций влияют на производительность программы Java EE. Эталонный вызов вызывает метод, аннотированный аннотацией «Y» из метода с аннотацией «X». Операции в моем тесте освещающих ситуацию банковского перевода:@Never атрибут транзакции ужасно медленный

@Required   @RequiresNew 
theCallerMethod() -> updateAccount(Account acc) 
        @RequiresNew 
        -> updateOwner(Company c) 
        @RequiresNew 
        -> addLogEntry(Transfer t) 

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

И я был очень удивлен, когда выяснилось, что самые медленные звонки были из @ Никогда-аннотированного метода звонящего: для выполнения 1000 описанных выше вызовов для @Required -> @Required сценария потребовалось 5,71 сек., @ Требуется -> @RequiresNew 6,35 сек., Но 9,05 сек. для @Never -> @Not_Supported и 8,95 sec. для @Never -> @Поддержка.

Это нормально для @ Никогда-контекстов для выполнения так долго? Я имею в виду, что у нас даже нет транзакции для приостановки и возобновления. Может быть, есть общие знания о атрибуте @Never, который я пропустил?

Я использую Java EE 6, GlassFish 3, MySQL 5.1.69 InnoDB.

Заранее спасибо.

ответ

2

У меня даже нет транзакции для приостановки и возобновления.

Я не был бы так уверен в этом. Это то, что ejb3.1 specification говорит:

13.6.5 Обработка методы, которые выполняются с «неустановленным контекстом транзакции»

Спецификация EJB не предписывает, как контейнер должен управлять исполнением метод с неопределенным контекстом транзакции семантика транзакции остается в реализации контейнера. Некоторые методы для того, как контейнер может выбрать для реализации выполнения метода с неопределенный контекст транзакции являются (список не является исчерпывающим всех возможных стратегий):

(среди других возможностей)

Контейнер может обрабатывать каждый вызов экземпляра диспетчеру ресурсов как одну транзакцию (например, контейнер может установить параметр автоматической фиксации в соединении JDBC).

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