1. Весенние декларативные транзакции
1.1 Spring's Transaction Manager
Spring напрямую управляет транзакциями, но делегирует ответственность за управление транзакциями в реализации транзакций конкретной платформы, предоставленной JTA или соответствующими механизмом постоянства. Контейнер для пружины отвечает за работу вещей, пружинный контейнер действует как лицо, а метод транзакции называется обработкой улучшения. Сгенерированный метод прокси -объекта - это целевой метод + улучшение, которое является, программист транзакции использует только операцию CRUD, то есть целевой метод и объявленный метод должны выполняться в транзакции.
Spring предоставляет много встроенных реализаций менеджера транзакций:
DataSourcetransActionManager: расположен в пакете org.springframework.jdbc.datasource, менеджер транзакций данных источника данных предоставляет одну javax.sql.datasource Управление транзакциями, для управления транзакциями анонзирующей фреймворки Ibatis или Mybatis;
JdotransactionManager: находится в пакете org.springframework.orm.jdo, обеспечивая управление транзакциями одного javax.jdo.persistencemanagerfactory, для управления транзакциями при интеграции рамки JDO;
JPatransactionManager: находится в пакете org.springframework.orm.jpa, обеспечивая поддержку одного javax.persistence.entityManagerFactory и используется для управления транзакциями при интеграции структуры реализации JPA;
HibernateTransactionManager: находится в пакете org.springframework.orm.hibernate3, обеспечивая поддержку одной транзакции org.hibernate.sessionFactory, используемой для управления транзакциями при интеграции платформы Hibernate; Этот менеджер транзакций поддерживает только версию Hibernate3+, а версия Spring3.0+ поддерживает только версию Hibernate 3.2+;
JtatransactionManager: находится в пакете org.springframework.transaction.jta, обеспечивая поддержку управления распределенными транзакциями и делегирование управления транзакциями в диспетчер транзакций приложений Java EE;
Oc4jjtatransactionManager: расположен в пакете org.springframework.transaction.jta, Spring обеспечивает адаптер OC4J10.1.3+ Manager транзакции сервера приложений. Этот адаптер используется для поддержки расширенных транзакций, предоставленных сервером приложений;
WebsphereuowtransactionManager: расположен в пакете org.springframework.transaction.jta, Spring предоставляет адаптер для менеджера транзакций сервера приложений WebSphere 6.0+. Этот адаптер используется для поддержки передовых транзакций, предоставляемых серверами приложений;
Weblogicjtatransactionmanager: расположен в пакете org.springframework.transaction.jta, Spring обеспечивает адаптер для менеджера транзакций сервера приложений Weblogic 8.1+. Этот адаптер используется для поддержки расширенных транзакций, предоставленных сервером приложений.
Spring не только предоставляет эти менеджеры по транзакциям, но также предоставляет менеджеров для управления транзакциями JMS и т. Д. Spring обеспечивает последовательную абстракцию транзакций, как показано на рисунке.
Весна и спят
иллюстрировать:
Spring выполняет некоторые препараты перед вызовом конкретного диспетчера транзакций, устанавливая заранее политики чтения и записи транзакции, и эти политики транзакций являются публичными вещами и написаны в файле конфигурации Spring. Обработка этого содержимого должна быть помещена в абстрактный класс.
2. Обработка транзакций в интеграции пружины и гиберната
1.2 Введение файла конфигурации свойств в форме XML
<name = name = "locations"> <value> classpath: jdbc.properties </value> </property>
Настройка источника данных DBCP
<bean id = "dataSource" Drest Method = "close"> <name = "driverClassname" value = "$ {jdbc.driverclassname}" /> <name = "url" value = "$ {jdbc.Url}" /> <property name = "username" value = "$ {jdbc.Urnam value = "$ {jdbc.password}" /> < /bean>Введите SessionFactory, используйте файл внешней конфигурации Hibernate
<bean id = "sessionfactory2"> <name = "configlocation"> <datue> classpath: hibernate.cfg.xml </value> </property> </bean>
Вводить слои DAO и сервис
<bean id = "persondao"> <property name = "sessionFactory"> <ref bean = "sessionFactory2"/> </property> </bean> <bean id = "personservice"> <property name = "persondao"> <ref bean = "persondao"/> </property> </bean>
Настройка диспетчера транзакций Hibernate
<bean id = "transactionManager"> <name = "sessionFactory"> <ref bean = "sessionFactory2"/> </property> </bean>
Настройте декларативные транзакции
эффект:
1. Расскажите менеджер транзакций пружинных контейнеров
2. Расскажите пружинный контейнер, какой метод использовать какой транзакцию
<TX: консультирование Transaction-manager = "transactionManager" id = "tx"> <TX: атрибуты> <!-Имя Область целевого метода метода выделения. Выделение уровня распространения распространения. </tx: атрибуты> </tx: консультант>
Настройте точку входа
<aop: config> <aop: pointcut expression = "execution (*cn.qjc.hibernate.service.impl.*.*(..))" id = "recome"/> <span style = "Белое пространство: pre"> </span> <!-Применить точка к методу улучшения-> <aop: Advisor count-ref = "tx" tx "optcut-ref-ref ="/aop: "/aop:"/aop: aop: aop: apisor ref = "tx".
Класс реализации DAO
* Метод реализации 1: Унаследовать hibernatedaosupport * @author qjc */ persondaoimpl werbernatedaosupport реализует Persondao {@override public void saveperson (человек) {this.gethibernateTemptemptement (). Сохранить (человек); }}тест
...
Уведомление:
1. Если класс DAO наследует HibernatedAosupport, вам нужно только внедрить SessionFactory в файл конфигурации пружины.
2. Если класс DAO не наследует HibernatedAosupport, он должен иметь атрибут SessionFactory и внедрить его в файл конфигурации.
<bean id = "hibernateTemplate"> <name = "sessionFactory" ref = "sessionFactory2"> </property> </bean>
1.2 В виде аннотации
1. Применить механизм автоматического сканирования Spring в файлах конфигурации
<Контекст: компонент-сканирование Base-package = "cn.qjc"/>
2. Введите анализатор аннотации в файле конфигурации
<TX: управляемая аннотациями транзакция-manager = "transactionManager"/>
3. Аннотируйте через @Transaction на сервисном уровне
Примечание. Если аннотировать как транзакция только для чтения на уровне класса, настройки транзакции @Transaction, аннотированные в методах в этом классе, будут иметь приоритет над настройками транзакций на уровне класса.
1.3 Свойства распространения пружинных транзакций
Требуется: бизнес -метод должен работать в транзакции. Если метод уже находится в транзакции при его запуске, присоединяйтесь к транзакции, в противном случае создайте для себя новую транзакцию (по умолчанию)
Не поддерживается: пружинный контейнер не открывает транзакцию. Если метод вызван в транзакции, транзакция будет приостановлена. После завершения метода транзакция будет восстановлена.
Требуется, существует ли транзакция, бизнес -метод всегда будет создавать новую транзакцию.
Mandatorky: бизнес -метод может быть выполнен только в существующей транзакции. Если бизнес -метод вызывается без транзакции, контейнер бросает исключение.
Кроме того, существуют такие свойства, как опоры, никогда, вложенные и т. Д., Но обычно используется дефолт
Распространение = "Требуется" Эта конфигурация может решить проблему гнездования транзакций. Что такое гнездование транзакций?
например:
В рамках рабочего процесса есть транзакции и определенный метод, который управляет уровнем обслуживания. Сервисный уровень также имеет свои собственные транзакции. При выполнении службы будет происходить гнездование транзакций, то есть сам метод имеет транзакции, а методы в методе также имеют транзакции. Это гнездование транзакций. Spring решает эту проблему с помощью атрибута распространения транзакции распространение = «требуется».
1.4 OpenInsessionView
После интеграции S2SH Spring управляет транзакциями. Поскольку он использует метод обработки декларативной транзакции Spring, сеанс закрыт сразу после вызова this.gethibernateTemplate (). Если есть транзакции в выполненном в настоящее время метод, сеанс закрыт при вызове метода транзакционной среды. Таким образом, исключение будет сгенерировано, когда значение выводится на странице.
Метод обработки: режим OpenSessionInview (настроенный в web.xml)
<filter> <filter-name> hibernatefilter </filter-name> <filter-class> org.springframework.orm.hibernate3.support.opensessionInviewFilter </filter-class> <!-Одинокая сторона верна по умолчанию. Если установить на false, он равен No OpenSessionInView-> <Init-param> <param-name> SingleSession </param-name> <-param-value> true </param-value> </init-param> </filter> <Filter-MAPPING> <Filter-name> Hibernatefilter </filter-Name> <RLL-pattern> </url-pattern> </url-pattern> </url-pattern> </url-patterner> <//filter> </url-patterner> <//filter> </url-patterner> <//url-patternerservice>
Из приведенного выше кода мы видим, что при отправке запроса сеанс был включен в OpenSessionInview, и сеанс должен быть закрыт после ответа, что означает, что OpenSessionInView должен быть перед фильтром Struts2. (Поместите позицию фильтра Struts2 выше)
Тем не менее, у него также есть недостатки, чтобы включить OpenSessionInInView: Поскольку выключение сеанса задерживается, а в сеансе находится кэш Hibernate первого уровня, что приведет к тому, что большое количество кэшированных данных оставалось в памяти в течение длительного времени.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.