235.7.7. 거래 참여
camel-mybatis 아래에 트랜잭션 관리자를 설정하는 것은 표준 MyBatis SqlMapConfig.xml 파일 외부의 데이터베이스 구성을 외부화하는 것을 포함하므로 약간 짧을 수 있습니다.
첫 번째 부분에는 DataSource 를 설정해야 합니다. 이는 일반적으로 Spring 프록시에서 래핑해야 하는 풀( DBCP 또는 c3p0)입니다. 이 프록시를 사용하면 DataSource 를 사용하지 않아 Spring 트랜잭션에 참여할 수 있습니다(MyBatis SqlSessionFactory 가 이 작업을 수행합니다).
<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<constructor-arg>
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="org.postgresql.Driver"/>
<property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/myDatabase"/>
<property name="user" value="myUser"/>
<property name="password" value="myPassword"/>
</bean>
</constructor-arg>
</bean>이는 속성 자리 표시자를 사용하여 데이터베이스 구성을 외부화할 수 있다는 추가적인 이점이 있습니다.
그러면 트랜잭션 관리자가 최외의 DataSource 를 관리하도록 구성됩니다.
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
mybatis-spring SqlSessionFactoryBean 은 동일한 DataSource 를 래핑합니다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- standard mybatis config file -->
<property name="configLocation" value="/META-INF/SqlMapConfig.xml"/>
<!-- externalised mappers -->
<property name="mapperLocations" value="classpath*:META-INF/mappers/**/*.xml"/>
</bean>그런 다음 camel-mybatis 구성 요소는 해당 팩토리로 구성됩니다.
<bean id="mybatis" class="org.apache.camel.component.mybatis.MyBatisComponent">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>마지막으로 트랜잭션 정책은 트랜잭션 관리자 맨 위에 정의된 후 평소와 같이 사용할 수 있습니다.
<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
<camelContext id="my-model-context" xmlns="http://camel.apache.org/schema/spring">
<route id="insertModel">
<from uri="direct:insert"/>
<transacted ref="PROPAGATION_REQUIRED"/>
<to uri="mybatis:myModel.insert?statementType=Insert"/>
</route>
</camelContext>