Spring 의 사무 메커니즘 인 스 턴 스 코드
JAVA EE 전통 사무 메커니즘
일반적으로 두 가지 사무 전략 이 있 는데 그것 이 바로 전역 사무 와 국부 사무 이다.전역 사 무 는 여러 개의 사무 적 자원(즉,데이터 원본,전형 적 인 것 은 데이터베이스 와 메시지 대기 열)을 뛰 어 넘 을 수 있 습 니 다.보통 J2EE 응용 서버 의 관리 가 필요 합 니 다.그 밑 에 서버 의 JTA 지원 이 필요 합 니 다.한편,국 지적 인 사 무 는 바 텀 에서 사용 하 는 지구 화 기술 과 관련 이 있 는데 만약 에 바 텀 에서 JDBC 를 직접 사용 하면 Connection 대상 으로 사 무 를 처리 해 야 한다.Hibernate 지구 화 기술 을 사용 하려 면 session 대상 을 사용 하여 업 무 를 조작 해 야 합 니 다.
일반적으로 JTA 사무,JDBC 사무 및 Hibernate 사 무 를 사용 하 는 프로 그래 밍 절 차 는 다음 과 같 습 니 다.
위의 그림 에서 도 알 수 있 듯 이 전통 적 인 트 랜 잭 션 프로 그래 밍 을 사용 하면 프로그램 코드 는 구체 적 인 트 랜 잭 션 전략의 API 와 결합 해 야 한다.만약 에 하나의 전략 을 전환 해 야 한다 면 코드 를 대폭 수정 해 야 한 다 는 것 을 의미한다.하지만 스프링 사 무 를 사용한다 면 이 문 제 는 없 을 것 이다.
Spring 사무 메커니즘
Sring 은 어떠한 사무 지원 도 제공 하지 않 았 습 니 다.이것 은 포장 밑바닥 의 업무 만 맡 고 Spring 차원 에서 대외 적 으로 통 일 된 프로 그래 밍 API 를 제공 합 니 다.Spring 트 랜 잭 션 의 핵심 은 PlatformTransactionManager 인터페이스 입 니 다.
PlatformTransactionManager 는 구체 적 인 유형 과 무관 한 사무 인 터 페 이 스 를 대표 하 며 JDBC 사무,Hibernate 사무,심지어 JTA 사 무 를 포함 한 모든 사 무 를 대표 할 수 있 습 니 다.
Springa 사무 체 제 는 전형 적 인 전략 모델 이다.PlatformTransactionManager 는 사무 관리 인 터 페 이 스 를 대표 하지만 사 무 를 어떻게 관리 하 는 지 모 르 고 사무 관리 에 시작 사무
getTransaction(),
제출 사무commit()
와 스크롤 백 사무rollback()
라 는 세 가지 방법 만 요구 하지만 구체 적 으로 어떻게 실현 하 는 지 는 실제 유형 에 맡 겨 야 한다.프로그래머 는 설정 파일 에서 구체 적 으로 사용 해 야 할 트 랜 잭 션 유형 에 따라 설정 하면 Spring 바 텀 은 자동 으로 구체 적 인 트 랜 잭 션 실현 류 를 사용 하여 트 랜 잭 션 을 수행 합 니 다.프로그래머 에 게 는 바 텀 과정 에 전혀 관심 을 가지 지 않 고 PlatformTransactionManager 인터페이스 로 프로 그래 밍 을 하면 됩 니 다.PlatformTransactionManager 인터페이스 에서 다음 과 같은 방법 을 제공 합 니 다.getTransaction(..), commit(); rollback();
이것들 은 모두 플랫폼 과 무관 한 사무 조작 입 니 다.getTransaction()
의 전체 표기 법 은TransactionStatus getTransaction(TransactionDefinition definiton)
이다.이 방법 은 하나의 사무 대상 을 되 돌려 주 는 데 사 용 됩 니 다.그 중의 매개 변 수 는 TransactionDefinition 은 사무 대상 에 게 각종 속성 을 지정 할 수 있 습 니 다.보통 업무 의 격 리 속성,전파 속성,시간 초과,이 몇 가지 속성 만 읽 을 수 있 습 니 다.
Spring 의 구체 적 인 사무 관 리 는 프로필 에 PlatformTransactionManager 를 설정 해 야 합 니 다.다음은 서로 다른 유형의 사무 에 대응 하 는 Spring 설정 입 니 다.
JDBC 데이터 원본 의 국부 사무 관리자 설정 은 다음 과 같 습 니 다.
<!-- Bean, C3P0 , -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSrouce"
destroy-method="close"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost/test"
p:user="root"
p:password=""
p:maxPoolSize="40"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="30" />
<!-- JDBC , DataSourceTransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
용기 관리의 JTA 전역 사무 관리자 설정 은 다음 과 같 습 니 다.
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiName="jdbc/jpetstore" />
<!-- JtaTransactionManager , PlatformTransactionManager -->
<!-- JTA ,Spring Java EE , -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
JTA 전역 트 랜 잭 션 에 대해 서 는 트 랜 잭 션 관리자 의 구현 클래스 인 JTaTransactionManager 만 지정 하면 됩 니 다.Spring 용 기 는 J2EE 서버 에서 데이터 원본 을 가 져 와 트 랜 잭 션 관리자 에 명시 적 으로 주입 하지 않 아 도 됩 니 다.Hibernate 지구 화 기술 을 바탕 으로 하 는 Spring 국부 사무 설정 은 다음 과 같 습 니 다.
<!-- Bean, C3P0 , -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSrouce"
destroy-method="close"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost/test"
p:user="root"
p:password=""
p:maxPoolSize="40"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="30" />
<!-- Hibernate SessionFactory, SessionFactory , dataSource -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<!-- annotatedClasses -->
<property name="annotatedClasses">
<list>
<!-- PO -->
<value>com.entity.User</value>
</list>
</property>
<!-- Hibernate sessionFactory -->
<property name="hibernateProperties">
<props>
<!-- Hibernate -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!-- Hibernate -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- Hibernate , HibernateTransactionManager -->
<!-- PlatformTransactionManager Hibernate -->
<!-- HibernateTransactionManager sessionFactory -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
Spring 트 랜 잭 션 이 Hibernate 정책 을 사용 하려 면 데이터 원본,session Factory,트 랜 잭 션 관리자 세 가 지 를 설정 해 야 합 니 다.만약 에 밑 에 Hibernate 지구 층 기술 을 사용 하고 업무 가 JTA 전역 사 무 를 사용 할 때 다음 과 같이 설정 합 니 다.
<!-- JTA -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiName="jdbc/jpetstore" />
<!-- Hibernate SessionFactory, SessionFactory , dataSource -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<!-- annotatedClasses -->
<property name="annotatedClasses">
<list>
<!-- PO -->
<value>com.entity.User</value>
</list>
</property>
<!-- Hibernate sessionFactory -->
<property name="hibernateProperties">
<props>
<!-- Hibernate -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<!-- Hibernate -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- JtaTransactionManager , PlatformTransactionManager -->
<!-- -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
이 는 이전 Hibernate 기반 Spring 사무 에 비해 데이터 원본 을 JNDI 데이터 원본 으로 바 꾸 고 사무 관리 자 를 JtaTransactionManager 로 바 꾸 는 것 입 니 다.JTA 전역 트 랜 잭 션 에 대해 서 는 바 텀 애플 리 케 이 션 서버 의 지원 이 필요 하기 때문에 애플 리 케 이 션 서버 가 제공 하 는 JTA 전역 트 랜 잭 션 에 디 테 일 한 차이 가 있 을 수 있 습 니 다.따라서 실제 전역 트 랜 잭 션 관리 자 를 설정 할 때 는 JTaTransactionManager 의 하위 클래스 를 사용 해 야 할 수 있 습 니 다.예 를 들 어 Oracle 자바 EE 애플 리 케 이 션 서버 가 제공 하 는 OC4JJTaTransactionManager 등 입 니 다.Oracle 이 WebLogic 에 제공 하 는 WebLogicJtaTransactionManager,IBM 이 WebSphere 에 제공 하 는 WebSphere Uow TransactionManager 등.
위의 각종 트 랜 잭 션 유형의 Spring 설정 을 통 해 알 수 있 듯 이 프로그램 이 Spring 트 랜 잭 션 관 리 를 사용 할 때 응용 프로그램 은 구체 적 인 트 랜 잭 션 API 와 결합 할 필요 가 없고 응용 프로그램 은 PlatormTransactionManager 인터페이스 프로 그래 밍 만 하면 됩 니 다.applicationContext 는 배치 파일 에 따라 적당 한 트 랜 잭 션 전략 실현 클래스(즉,PlatormTransactionManager 의 실현 클래스)를 선택 합 니 다.
그렇다면 구체 적 으로 Spring 에서 트 랜 잭 션 제어 프로 그래 밍 을 어떻게 하 는 지 는 보통 두 가지 방식 이 있다.
프로 그래 밍 식 사무 관리:바로 코드 에서 PlatormTransactionManager 가 제공 하 는 세 가지 추상 적 인 방법 으로 사무 절 차 를 제어 하 는 것 이다.또한 Spring 용기 에서 PlatormTransactionManager 유형의 Bean 을 가 져 올 수 있 습 니 다.이 Bean 은 항상 PlatormTransactionManager 의 구체 적 인 실현 류 의 인 스 턴 스 이 고 구체 적 인 실현 류 는 ApplicationContext 에서 전략 모델 에 따라 선택 합 니 다.프로그래머 들 은 관심 을 가지 지 않 고 인터페이스 프로 그래 밍 만 하면 됩 니 다.
성명 식 트 랜 잭 션 관리:트 랜 잭 션 제어 프로 세 스 를 코드 에 기록 하지 않 고 AOP 를 통 해 설정 파일 로 트 랜 잭 션 을 수행 하 는 방식 입 니 다.즉,XML 프로필 은 업무 구성 요소 에 사무 대 리 를 설정 할 수 있 고 사무 대 리 는 업무 구성 요소 에 사무 통 제 를 제공 할 수 있 습 니 다.현재 이런 방식 이 가장 좋 고 소스 코드 의 침입 성 이 가장 낮다.
성명 식 트 랜 잭 션 관리 사용-XML Schema 트 랜 잭 션 정책 사용
성명 식 사 무 를 사용 할 때 설정 파일 만 작성 하고 트 랜 잭 션 제어 가 필요 한 구성 요소 종 류 를 설정 하면 업무 구성 요 소 는 AOP 체제 에서 트 랜 잭 션 제어 로 짜 여 집 니 다.프로 그래 밍 자 는 트 랜 잭 션 관리 코드 를 쓰 지 않 아 도 업무 구성 요소 개발 에 전념 할 수 있 습 니 다.따라서 일반적으로 성명 식 사무 관 리 를 추천 합 니 다.
Spring 의 XML Schema 방식 은 간결 한 사무 설정 전략 을 제공 합 니 다.네 임 스페이스
<tx:advice>
를 통 해 하나의 사무 강화 처 리 를 설정 합 니 다.그 중에서 업무 의 각종 속성(예 를 들 어 격 리 속성,전파 속성,시간 초과,읽 기 속성 등)을 지정 할 수 있 습 니 다.그 다음 에
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- Bean, C3P0 , -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8"
p:user="root"
p:password=""
p:maxPoolSize="40"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="30" />
<!-- JDBC , DataSourceTransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
<!-- Bean -->
<bean id="newsDao" class="com.dao.impl.NewsDaoImpl" p:ds-ref="dataSource" />
<!-- , -->
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<!-- -->
<tx:attributes>
<!-- get -->
<tx:method name="get*" read-only="true" />
<!-- , 5 -->
<tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="5" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- , impl impl -->
<aop:pointcut expression="execution(* com.dao.impl.*Impl.*(..))" id="myPointcut" />
<!-- myPointcut txAdvice -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
<!-- , impl abc -->
</aop:config>
</beans>
뉴스 DaoImpl 코드 에 중복 데 이 터 를 표 에 삽입 합 니 다.
package com.dao.impl;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import com.dao.NewsDao;
public class NewsDaoImpl implements NewsDao {
private DataSource ds;
public void setDs(DataSource ds) {
this.ds = ds;
}
@Override
public void insert(String title, String content) {
//c3p0
JdbcTemplate jt = new JdbcTemplate(ds);
jt.update("insert into news_inf" + " values(100,?,?)", title, content);
jt.update("insert into news_inf" + " values(100,?,?)", title, content);
// ,
// ,
}
}
다음은 테스트 방법,
public static void test3() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans4JDBC.xml");
// Bean
NewsDao dao = (NewsDao)ctx.getBean("newsDao", NewsDao.class);
dao.insert("java ", " Java EE ");
System.out.println(" ");
}
테스트 방법 을 실행 하면 이상 을 던 지 는 것 을 발견 할 수 있 으 며,트 랜 잭 션 제어 로 인해 데이터 베 이 스 는 삽입 되 지 않 습 니 다.위의 예 에서 볼 수 있 듯 이 XML Schema 에 대한 설정 은 보통 Bean 에 AOP 설정 을 하고 advice 를 짜 서 강화 하 는 것 입 니 다.advice 강화 에 서 는 사무 관리 자 를 설정 하고 사무 관리 자 는 데이터 원본 에 의존 합 니 다.
또한
@Transactionl 사용 하기
XML Schema 를 사용 하 는 방법 외 에 도 방법 에@Transaction 주 해 를 직접 추가 하여 이 방법 이 사무 속성 을 가지 도록 할 수 있 습 니 다.@Transaction 에 서 는 트 랜 잭 션 에 다양한 속성(예 를 들 어 격 리 속성,전파 속성,시간 초과,속성 만 읽 기 등)을 설정 할 수 있 습 니 다.또한 XML 설정 에
<tx:annotation-driven transaction-manager="transactionManager" />
NewsDaoImpl.
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, timeout=5)
@Override
public void insert(String title, String content) {
총결산이상 은 본 논문 에서 Spring 의 사무 체제 인 스 턴 스 코드 에 관 한 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사이트 의 다른 관련 주 제 를 계속 참고 할 수 있 습 니 다.부족 한 점 이 있 으 면 댓 글로 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.