前言
这是一篇用Spring和Jencks 实现的轻量级解决方案,不依赖于应用服务器。本文是方案实现的记录,不涉及理论探讨,有关理论资源请参见本文的《解读 》和参考资料。有关多数据库的分布式事务的实践,请参见Spring JTA应用 。
思路
- Jencks提供事务管理器(Transaction Manager)和连接管理器(ConnectionManager);
- Jackrabbit的jca包提供JCR的托管连接工厂(ManagedConnectionFactory);
- Jencks为Hibernate提供支持托管连接(ManagedConnenction)的数据源(DataSource);
- Spring提供JTA的集成。
Bean依赖关系图
XML配置片段
Hibernate片段
<!-- 数据源 --> <bean id="jdbcManagedConnectionFactory" class="org.jencks.tranql.DataSourceMCF"> <property name="driverName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="dataSource" class="org.jencks.factory.ConnectionFactoryFactoryBean"> <property name="managedConnectionFactory" ref="jdbcManagedConnectionFactory" /> <property name="connectionManager"> <bean parent="connectionManager" /> </property> </bean> <!-- 会话工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="jtaTransactionManager"> <bean factory-bean="transactionManager" factory-method="getTransactionManager" /> </property> <property name="hibernateProperties"> <util:properties location="classpath:/hibernate.properties" /> </property> <property name="packagesToScan" value="zhongl.demo.transaction" /> <property name="dataSource" ref="dataSource" /> </bean> <!-- 数据访问编程模板 --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
注:上面需要spring-util命名空间支持。
Jackrabbit片段
<!-- JCR模板 --> <bean id="jcrTemplate" class="org.springmodules.jcr.JcrTemplate"> <property name="allowCreate" value="true" /> <property name="sessionFactory"> <ref local="jcrSessionFactory" /> </property> </bean> <!-- 会话工厂 --> <bean id="jcrSessionFactory" class="org.springmodules.jcr.JcrSessionFactory"> <property name="credentials"> <bean class="zhongl.demo.transaction.CredentialsFactoryBean" /> </property> <property name="repository"> <ref local="repository" /> </property> </bean> <!-- Jackrabbit库 --> <bean id="repository" class="org.springframework.jca.support.LocalConnectionFactoryBean"> <property name="managedConnectionFactory"> <ref local="repositoryManagedConnectionFactory" /> </property> <property name="connectionManager"> <bean parent="connectionManager" /> </property> </bean> <bean id="repositoryManagedConnectionFactory" class="zhongl.demo.transaction.JCAManagedConnectionFactoryFactoryBean"> <property name="homeDir" value="file:${repository.home}_jta" /> <property name="configFile" value="classpath:${repository.configuration}" /> </bean>
注: CredentialsFactoryBean和JCAManagedConnectionFactoryFactoryBean是为了配置方便,自定义实现的。
JTA的片段
<!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction"> <ref local="delegateTransactionManager" /> </property> </bean> <bean id="delegateTransactionManager" class="org.jencks.factory.TransactionManagerFactoryBean" /> <!-- 连接管理器 --> <bean id="connectionManager" class="org.jencks.factory.ConnectionManagerFactoryBean" abstract="true"> <property name="transactionManager"> <ref local="delegateTransactionManager" /> </property> <property name="transaction" value="xa" /> </bean>
Spring注解支持片段
<!-- 自动扫描装配组件 --> <context:component-scan base-package="zhongl.demo.transaction" /> <!-- 加载参数文件 --> <context:property-placeholder location="classpath:/jdbc.properties,classpath:/jackrabbit.properties" /> <!-- 注解驱动事务配置 ,transactionManager省略为默认配置 --> <tx:annotation-driven />
注:关于注解细节请详细参见 Sping2.5的参考手册 。
上述配置所需的依赖包和版本如下:
- jcr 1.0
- jackrabbit-core 1.5.0
- jackrabbit-jca 1.5.0
- hibernate 3.2.0.ga
- hibernate-annotations 3.2.0.ga
- jencks 2.1
- tranql-connector 1.4
- spring 2.5.6
- spring-modules-jcr 0.9
完整示例代码
参考资料