Как мне интегрировать поддержку
предоставление ресурсов подключения и JTA
транзакции в мое приложение J2SE?
Привет, Крис
В этой задаче есть два элемента:
1) Создание JTA API, в основном UserTransaction, доступным для кода приложения, чтобы он мог запускать и завершать транзакции. В среде Java EE она опубликована в известном месте в JNDI. Если у вас есть реализация JNDI, то вам пора (используйте класс JNDIManager JBossTS, чтобы помочь вам с настройкой). В противном случае вам понадобится какой-то заводской объект или механизм впрыска. Конечно, вы также можете предоставить класс реализации непосредственно конечному пользователю, но это несколько неприятно, так как ограничивает любые шансы на замену JTA в будущем.
public javax.transaction.UserTransaction getUserTransaction() {
return new com.arjuna.ats.internal.jta.transaction.UserTransactionImple();
}
Вот и все - теперь вы можете начинать, фиксировать и откатывать транзакции. Некоторые контейнеры также публикуют класс TransactionManager в приложениях аналогичным образом, но он действительно предназначен для использования самим контейнером и редко требуется для кода приложения.
2) Автоматическое управление зачислением XAResources. Менеджеры ресурсов, то есть базы данных и очереди сообщений, имеют драйверы, которые реализуют XAResource. Каждый раз, когда приложение получает соединение с менеджером ресурсов, соответствующий XAResource должен быть передан реализации JTA, чтобы он мог управлять менеджером ресурсов как часть 2PC. Большинство серверов приложений поставляются с JCA, который обрабатывает это автоматически. В средах без них вам нужна альтернатива, чтобы уберечь код приложения от необходимости выполнять эту утомительную задачу вручную. TransactionalDriver в комплекте с JBossTS обрабатывает это для соединений JDBC. XAPool также стоит рассмотреть.
JBossTS был внедрен во многих средах на протяжении многих лет. Некоторые из извлеченных уроков описаны в Руководстве по интеграции http://anonsvn.jboss.org/repos/labs/labs/jbosstm/trunk/atsintegration/docs/], и если вы хотите рабочий пример, вы можете посмотреть на работу по интеграции tomcat http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/tomcat-integration/]
ТМ JBoss ужасен. По крайней мере, если
вы надеетесь на ACID транзакции.
Привет, Эриксон
Я не думаю, что зашел бы так далеко, как "ужасный". Он невероятно мощный и легко конфигурируемый, что может сделать опыт из коробки немного пугающим для новичков. Корректная конфигурация восстановления особенно сложна, поэтому я полностью поддерживаю ваш комментарий о тщательном тестировании. Кроме того, мне неизвестны какие-либо задокументированные тестовые случаи, в которых в настоящее время не удается получить результаты ACID при использовании с совместимыми со спецификацией менеджерами ресурсов. Если у вас есть такой случай или просто более конструктивные предложения по улучшению, сообщите об этом JBoss, чтобы решить эту проблему.
Не изобретай велосипед. Использовать
Spring Framework. Это уже обеспечивает
эта функциональность и многое другое.
-1 Spring не предоставляет реализацию JTA, просто оболочку для различных сторонних приложений. Это распространенное недоразумение.
JTA поддерживает локальные транзакции и
глобальные транзакции.
Еще одно заблуждение, я боюсь. Спецификация JTA имеет дело только с XA, то есть глобальными транзакциями. Существуют различные хорошо известные методы для того, чтобы заставить менеджер транзакций JTA управлять локальными транзакциями. Обычно это включает в себя соединение Connection в XAResource. Хотя большинство реализаций поддерживают это, на самом деле это выходит за рамки спецификации, и поэтому вам следует проконсультироваться с поставщиком, прежде чем выбирать реализацию JTA, если вам нужно такое поведение.