分表和其他表在一个库里,满足分布式事务
pom配置:
<!-- shardingjdbc --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>4.0.0-RC1</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>4.0.0-RC1</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-transaction-xa-core</artifactId> <version>4.0.0-RC1</version> </dependency>
数据源配置:
<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> <property name="uniqueResourceName" value="dataSource"/> <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/> <property name="xaProperties"> <props> <prop key="url">jdbc:mysql://${jdbc.host}/${jdbc.database}</prop> <prop key="user">${jdbc.username}</prop> <prop key="password">${jdbc.password}</prop> </props> </property> <property name="minPoolSize" value="20" /> <property name="maxPoolSize" value="50" /> <property name="borrowConnectionTimeout" value="30" /> <!--<property name="testQuery" value="select 1" />--> <property name="maintenanceInterval" value="60" /> <property name="maxIdleTime" value="60" /> <property name="maxLifetime" value="60"/> <property name="loginTimeout" value="60" /> </bean>
<!-- 分表数据源配置,分表策略--> <bean id="preciseModuloTableShardingAlgorithm" class="com.sharding.algorithm.TableShardingAlgorithm"/> <sharding:standard-strategy id="tableShardingStrategy" sharding-column="order_id" precise-algorithm-ref="preciseModuloTableShardingAlgorithm"/> <sharding:data-source id="shardingDataSource"> <sharding:sharding-rule data-source-names="dataSource"> <sharding:table-rules> <sharding:table-rule logic-table="t_order" table-strategy-ref="tableShardingStrategy" actual-data-nodes="dataSource.t_order${0..2}" /> </sharding:table-rules> </sharding:sharding-rule> </sharding:data-source>
分别为两个数据源配上sqlSessionFactory和MapperScannerConfigurer(为了省事只配了一个)
<bean id="shardingSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="shardingDataSource"/> <property name="mapperLocations" value="classpath:sharding/mapper/*.xml"/> <property name="configLocation" value="classpath:spring/mybatis-config.xml"/> <property name="typeAliasesPackage" value="sharding.entity" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="sharding.mapper"/> <property name="sqlSessionFactoryBeanName" value="shardingSessionFactory"/> </bean>
分布式事务配置:
<!-- 分布式事务 --> <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown" value="true"/> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300"/> </bean> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="atomikosTransactionManager"/> <property name="userTransaction" ref="atomikosUserTransaction"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/>
分表策略:
public final class TableShardingAlgorithm implements PreciseShardingAlgorithm<Long> { @Override public String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<Long> shardingValue) { for (String each : availableTargetNames) { if (each.endsWith(shardingValue.getValue() % 2 + "")) { return each; } } throw new UnsupportedOperationException(); } }