При использовании bean-компонента управляемого объекта контейнера контейнер сохраняется в базе данных? - PullRequest
1 голос
/ 18 февраля 2012

При использовании бина управляемого объекта контейнера, когда бин сохраняется в базе данных контейнером? Можно ли управлять этим внутри сервлета, используя некоторые операторы кода, или контейнер управляет этим автоматически изнутри?

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Как правило, он сохраняется в базе данных, когда ваша транзакция совершается.

С CMP вы можете управлять этим с помощью демаркации транзакции в дескрипторе депозита a'la

<ejb-jar>
...
<assembly-descriptor>
...
<container-transaction>
<method>
<ejb-name>EmployeeRecord</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>EmployeeRecord</ejb-name>
<method-name>updatePhoneNumber</method-name>
</method>
<trans-attribute>Mandatory</trans-attribute>
</container-transaction>
...

Это фрагмент из спецификации http://download.oracle.com/otn-pub/jcp/ejb-2.1-fr-spec-oth-JSpec/ejb-2_1-fr-spec.pdf

Когда вы вызываетеметод в ejb, новая транзакция может быть инициирована контейнером, в зависимости от вашего разграничения, и если метод завершается успешно, транзакция может быть зафиксирована, в зависимости от того-то и того-то.Например, если ваш конкретный метод был разграничен с помощью require-new, он будет зафиксирован, потому что он имеет свою собственную транзакцию, но если он разграничен с помощью require и был вызван в любой выполняющейся транзакции (например,поскольку он был вызван из метода сессионного компонента, разграниченного, скажем, с помощью require или require-new), он будет зафиксирован, когда будет завершена эта включающая транзакция.Или, если это не удастся, будет выполнен откат не только изменений, внесенных внутри этого метода, но и изменений, внесенных в вызов / транзакцию включающего метода.

Хотя дескриптор развертывания может разрешать вложенные транзакции, он фактически сводится к следующемукак механизм базы данных обрабатывает транзакции в конце.Очень часто rdbms на самом деле не поддерживает вложенные транзакции, а вместо этого использует точки сохранения транзакций, поэтому то, что кажется рекурсивным с точки зрения ejb, может фактически происходить в базе данных «линейно».В большинстве случаев результат одинаков.

Также может быть уместно рассмотреть уровень изоляции транзакции.

1 голос
/ 18 февраля 2012

Состояние бина гарантированно будет сохранено в базе данных при фиксации транзакции.Обычно контейнер будет ждать до момента фиксации, прежде чем сохранять состояние, чтобы избежать ненужных обновлений в случае отката транзакции или в случае изменения состояния несколько раз в одной транзакции.

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

...