最近项目中用到了多数据源,同时或者不同场景下操作不同的数据库,故而总结此篇文章。
JOTM (Java Open Transaction Manager)是由ObjectWeb协会开发的功能完整的且资源开放的独立的事务管理器。完全分布式事务支持.如果数据层、业务层、表示层运行在不同的 JVM 上,则有可能有一个全程的事务跨度这些JVM,事务的内容在 RMI/JRMP 和 RMI/IIOP 上传播。并且Spring对JOTM提供了较好的支持。
1.配置基础数据源(默认连接的数据库为常用数据库):jdbc.properties:
#oracle
portal.jdbc.driverClass=oracle.jdbc.driver.OracleDriver
portal.jdbc.jdbcUrl=jdbc:oracle:thin:@1.1.1.1:1521:orapub
portal.jdbc.user=testuser
portal.jdbc.password=123456
#JOTM分布式数据源连接池
#最小连接数
jdbc.minPoolSize=0
#最大连接数
jdbc.maxPoolSize=200
#PoolKeeper检测时间间隔
jdbc.sleepTime=120
#连接生命周期(上次访问时间-当前时间)
jdbc.lifeTime=120
#超过最大连接之后的调用getConnection的等待时间
jdbc.deadLockMaxWait=120
#超过最大连接之后的调用getConnection等待,在等待中重试的时间间隔
jdbc.deadLockRetryWait=100
2.数据源、事务配置文件spring.xml
<!-- JOTM实例 : JotmFactoryBean实现FactoryBean, DisposableBean -->
<bean id="jotm" class="com.utils.jotmutil.JotmFactoryBean">
<property name="defaultTimeout" value="500000"/>
</bean>
<bean id="myJtaManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction">
<ref local="jotm"/>
</property>
</bean>
<!-- 通过扫描的模式,扫描目录在com/hoo/任意目录下的mapper目录下,所有的mapper都需要继承SqlMapper接口的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.hoo.**.mapper" />
<property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
</bean>
<!-- 配置自定义的SqlSessionTemplate模板,注入相关配置,CustomSqlSessionTemplate继承SqlSessionTemplate重写相关方法 -->
<bean id="sqlSessionTemplate" class="com.utils.jotmutil.CustomSqlSessionTemplate">
<constructor-arg ref="portalSqlSessionFactory" />
<property name="targetSqlSessionFactorys">
<map> </map>
</property>
</bean>
<!-- 配置DataSource数据源 -->
<!-- 数据源portal 常用数据库 -->
<bean id="portal" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
<property name="transactionManager" ref="jotm"/>
<property name="driverName" value="${portal.jdbc.driverClass}"/>
<property name="url" value="${portal.jdbc.jdbcUrl}"/>
</bean>
</property>
<property name="user" value="${portal.jdbc.user}"/>
<property name="password" value="${portal.jdbc.password}"/>
<property name="minSize" value="${jdbc.minPoolSize}"/>
<property name="maxSize" value="${jdbc.maxPoolSize}"/>
<property name="sleepTime" value="${jdbc.sleepTime}"/>
<property name="lifeTime" value="${jdbc.lifeTime}"/>
<property name="deadLockMaxWait" value="${jdbc.deadLockMaxWait}"/>
<property name="deadLockRetryWait" value="${jdbc.deadLockRetryWait}"/>
</bean>
<!--创建sqlSessionFactory -->
<bean id="portalSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="portal"/>
<property name="mapperLocations" value="classpath*:com/hoo/**/*.xml" />
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTempla