выполнить последовательную транзакцию с использованием сеансового компонента ejb2 без сохранения состояния

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

Возможно ли последовательное выполнение клиентского запроса с использованием сеансового компонента ejb2 без сохранения состояния?

public generate(){
    .................
    update()
    .............
}
private update(){

  debugLog(" update query for "+id);

   //code for update query

  debugLog(" execute update query for "+id);


}

Когда я отправляю два запроса одновременно, я получаю журнал вроде ..

 update query for 16
 update query for 16
 execute update query for 17
 execute update query for 16

Но я хочу выполнить его серийно, как

update query for 16
 update query for 16
 execute update query for 16
 execute update query for 17

person chetan    schedule 27.03.2012    source источник
comment
Не могли бы вы привести пример кода того, что вы имеете в виду? За этим будет легче следить.   -  person Prashanth    schedule 27.03.2012


Ответы (1)


Для EJB-3.x:

  • Вам нужен singleton bean - @Singleton, здесь вы используете bean без сохранения состояния, который может выполняться параллельно и независимо для запросов в случайном порядке.

  • Теперь, упорядочивая события по порядку, вы должны использовать механизм блокировки на уровне класса / метода в соответствии с вашими требованиями.

    По умолчанию bean-компоненты, помеченные @Singleton, управляются контейнером и используют режим блокировки LockType.WRITE, могут явно применять @ConcurrencyManagement(CONTAINER). Если какой-либо метод вызывается клиентом, все остальные запросы должны будут ждать возврата предыдущего вызова.

    Вы также можете аннотировать на уровне метода с помощью @Lock(LockType.WRITE). Следовательно, последовательность вызовов будет соответствовать порядку, в котором они вызываются клиентами.

Для EJB-2.x:

  • Вы должны создать синглтон самостоятельно, поскольку аннотации недоступны.

  • Не уверен в параллелизме, управляемом контейнером, в EJB-2.x, но синхронизация метода ввода определенно поможет, поскольку он вызывает другие методы изнутри.

    Изменить: делегируйте запросы от bean-компонентов к одноэлементному служебному классу и соответствующему методу синхронизации. Следовательно, это решит как проблему объединения, так и синхронизации с bean-компонентами без сохранения состояния.

person Nayan Wadekar    schedule 27.03.2012
comment
Для EJB 2.x синхронизация метода работать не будет. Контейнер объединит экземпляры и предоставит каждому потоку отдельный bean-компонент. Вам потребуется синхронизировать общий / статический объект. - person Brett Kail; 28.03.2012
comment
@bkail Но если реализовать одноэлементный экземпляр bean-компонента, то синхронизация метода может сработать. В качестве обходного пути можно использовать простой служебный класс java для реализации этой функциональности и который может дополнительно вызывать методы сеансового компонента для операций с базой данных. ServiceLocator и Delegate могут с ним хорошо работать. - person Nayan Wadekar; 28.03.2012
comment
Вы имеете в виду, делегировать методы экземпляра синглтону? Это сработает. Как и синхронизация на общем / статическом объекте. Если вы обновите свой EJB-2.x Specific с этим, я буду поддерживать. - person Brett Kail; 29.03.2012
comment
@bkail Спасибо за ваш вклад, я отредактировал эту часть более конкретно. - person Nayan Wadekar; 29.03.2012