jta mysql_Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务

DataSource 配置

1 packagecom.cheng.dynamic.config;2

3 importjava.util.Properties;4

5 importjavax.sql.DataSource;6

7 importorg.springframework.beans.factory.annotation.Autowired;8 importorg.springframework.boot.jta.atomikos.AtomikosDataSourceBean;9 importorg.springframework.context.annotation.Bean;10 importorg.springframework.context.annotation.Configuration;11 importorg.springframework.context.annotation.Primary;12 importorg.springframework.core.env.Environment;13

14 @Configuration15 public classDataSourceConfig {16 @Autowired17 privateEnvironment env;18

19 @Bean(name = "primaryDS")20 @Primary21 public DataSource primaryDataSource() throwsException{22 AtomikosDataSourceBean ds = newAtomikosDataSourceBean();23 ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");24 ds.setUniqueResourceName("primaryRN");25 ds.setPoolSize(5);26 ds.setXaProperties(build("cheng.primary.datasource."));27 returnds;28 }29

30 @Bean(name = "secondaryDS")31 public DataSource dataSource() throwsException{32 AtomikosDataSourceBean ds = newAtomikosDataSourceBean();33 ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");34 ds.setUniqueResourceName("secondaryRN");35 ds.setPoolSize(5);36 ds.setXaProperties(build("cheng.secondary.datasource."));37 returnds;38 }39

40 privateProperties build(String prefix) {41 Properties prop = newProperties();42 prop.put("url", env.getProperty(prefix + "url"));43 prop.put("username", env.getProperty(prefix + "username"));44 prop.put("password", env.getProperty(prefix + "password"));45 prop.put("driverClassName", env.getProperty(prefix + "driverClassName"));46

47 returnprop;48 }49 }

JtaTransactionManagerConfig

1 packagecom.cheng.dynamic.config;2

3 importjavax.transaction.UserTransaction;4

5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.Configuration;7 importorg.springframework.transaction.jta.JtaTransactionManager;8

9 importcom.atomikos.icatch.jta.UserTransactionImp;10 importcom.atomikos.icatch.jta.UserTransactionManager;11

12 @Configuration13 public classJtaTransactionManagerConfig {14 @Bean(name = "xatx")15 publicJtaTransactionManager regTransactionManager () {16 UserTransactionManager userTransactionManager = newUserTransactionManager();17 UserTransaction userTransaction = newUserTransactionImp();18 return newJtaTransactionManager(userTransaction, userTransactionManager);19 }20 }

RepositoryPrimaryConfig

1 packagecom.cheng.dynamic.config;2

3 importjavax.sql.DataSource;4

5 importorg.apache.ibatis.session.SqlSessionFactory;6 importorg.mybatis.spring.SqlSessionFactoryBean;7 importorg.mybatis.spring.SqlSessionTemplate;8 importorg.mybatis.spring.annotation.MapperScan;9 importorg.springframework.beans.factory.annotation.Autowired;10 importorg.springframework.beans.factory.annotation.Qualifier;11 importorg.springframework.context.annotation.Bean;12 importorg.springframework.context.annotation.Configuration;13 importorg.springframework.context.annotation.Primary;14 importorg.springframework.core.env.Environment;15 importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;16

17 @Configuration18 @MapperScan(basePackages = "com.cheng.dynamic.repository.primary", sqlSessionTemplateRef = "sqlSessionTemplatePrimary")19 public classRepositoryPrimaryConfig {20 @Autowired21 privateEnvironment env;22 @Autowired23 @Qualifier("primaryDS")24 privateDataSource primaryDS;25

26 @Bean(name="sqlSessionFactoryPrimary")27 @Primary28 public SqlSessionFactory sqlSessionFactoryPrimary() throwsException{29 SqlSessionFactoryBean fb = newSqlSessionFactoryBean();30 fb.setDataSource(primaryDS);31 fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));//指定基包

32 fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapperLocations")));//指定xml文件位置

33 returnfb.getObject();34 }35

36 @Bean(name = "sqlSessionTemplatePrimary")37 @Primary38 public SqlSessionTemplate sqlSessionTemplatePrimary(@Qualifier("sqlSessionFactoryPrimary") SqlSessionFactory sqlSessionFactory) throwsException {39 SqlSessionTemplate sqlSessionTemplate = newSqlSessionTemplate(sqlSessionFactory);40 returnsqlSessionTemplate;41 }42 }

RepositorySecondaryConfig

1 packagecom.cheng.dynamic.config;2

3 importjavax.sql.DataSource;4

5 importorg.apache.ibatis.session.SqlSessionFactory;6 importorg.mybatis.spring.SqlSessionFactoryBean;7 importorg.mybatis.spring.SqlSessionTemplate;8 importorg.mybatis.spring.annotation.MapperScan;9 importorg.springframework.beans.factory.annotation.Autowired;10 importorg.springframework.beans.factory.annotation.Qualifier;11 importorg.springframework.context.annotation.Bean;12 importorg.springframework.context.annotation.Configuration;13 importorg.springframework.core.env.Environment;14 importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;15

16 @Configuration17 @MapperScan(basePackages = "com.cheng.dynamic.repository.secondary", sqlSessionTemplateRef = "sqlSessionTemplateSecondary")18 public classRepositorySecondaryConfig {19 @Autowired20 privateEnvironment env;21 @Autowired22 @Qualifier("secondaryDS")23 privateDataSource secondaryDS;24

25 @Bean(name="sqlSessionFactorySecondary")26 public SqlSessionFactory sqlSessionFactorySecondary() throwsException{27 SqlSessionFactoryBean fb = newSqlSessionFactoryBean();28 fb.setDataSource(secondaryDS);29 fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage2"));//指定基包

30 fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapperLocations2")));//指定xml文件位置

31 returnfb.getObject();32 }33

34 @Bean(name = "sqlSessionTemplateSecondary")35 public SqlSessionTemplate sqlSessionTemplateSecondary(@Qualifier("sqlSessionFactorySecondary") SqlSessionFactory sqlSessionFactory) throwsException {36 return newSqlSessionTemplate(sqlSessionFactory);37 }38 }

Test1Service

1 packagecom.cheng.dynamic.service;2

3 importorg.springframework.beans.factory.annotation.Autowired;4 importorg.springframework.stereotype.Service;5 importorg.springframework.transaction.annotation.Transactional;6

7 importcom.cheng.dynamic.entity.Test1;8 importcom.cheng.dynamic.entity.Test2;9 importcom.cheng.dynamic.repository.primary.Test1Dao;10

11 @Service12 @Transactional13 public classTest1Service {14 @Autowired15 privateTest1Dao test1Dao;16 @Autowired17 privateTest2Service test2Service;18

19 public voidtest(){20 System.out.println(test1Dao);21 }22

23 public voidadd(Test1 t){24 System.out.println(test1Dao.add(t));25 System.out.println(t.getId());26 }27

28 public voidsave(){29 Test1 t1 = newTest1();30 t1.setName("t1");31 add(t1);32 //System.out.println(1/0);

33 Test2 t2 = newTest2();34 t2.setName("t2");35 test2Service.add(t2);36 }37 }

测试类

1 packagecom.cheng.dynamic.service;2

3 importorg.junit.Test;4 importorg.junit.runner.RunWith;5 importorg.springframework.beans.factory.annotation.Autowired;6 importorg.springframework.boot.test.context.SpringBootTest;7 importorg.springframework.test.annotation.Rollback;8 importorg.springframework.test.context.junit4.SpringRunner;9 importorg.springframework.transaction.annotation.Transactional;10

11 @RunWith(SpringRunner.class)12 @SpringBootTest()13 @Transactional(transactionManager = "xatx")14 @Rollback(false)15 public classTest1ServiceTest {16 @Autowired17 privateTest1Service test1Service;18 @Test19 public void testTest() throwsException {20 test1Service.save();21 }22

23 }

druid监控配置

1 packagecom.cheng.dynamic.config;2

3 importorg.springframework.boot.web.servlet.FilterRegistrationBean;4 importorg.springframework.boot.web.servlet.ServletRegistrationBean;5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.Configuration;7

8 importcom.alibaba.druid.filter.stat.StatFilter;9 importcom.alibaba.druid.support.http.StatViewServlet;10 importcom.alibaba.druid.support.http.WebStatFilter;11 importcom.alibaba.druid.wall.WallConfig;12 importcom.alibaba.druid.wall.WallFilter;13

14 @Configuration15 public classDruidConfig {16 @Bean17 public ServletRegistrationBeandruidServlet() {18 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");19

20 //控制台管理用户,加入下面2行 进入druid后台就需要登录21 //servletRegistrationBean.addInitParameter("loginUsername", "admin");22 //servletRegistrationBean.addInitParameter("loginPassword", "admin");

23 returnservletRegistrationBean;24 }25

26 @Bean27 public FilterRegistrationBeanfilterRegistrationBean() {28 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>();29 filterRegistrationBean.setFilter(newWebStatFilter());30 filterRegistrationBean.addUrlPatterns("/*");31 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");32 filterRegistrationBean.addInitParameter("profileEnable", "true");33 returnfilterRegistrationBean;34 }35

36 @Bean37 publicStatFilter statFilter(){38 StatFilter statFilter = newStatFilter();39 statFilter.setLogSlowSql(true); //slowSqlMillis用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢。

40 statFilter.setMergeSql(true); //SQL合并配置

41 statFilter.setSlowSqlMillis(1000);//slowSqlMillis的缺省值为3000,也就是3秒。

42 returnstatFilter;43 }44

45 @Bean46 publicWallFilter wallFilter(){47 WallFilter wallFilter = newWallFilter();48 //允许执行多条SQL

49 WallConfig config = newWallConfig();50 config.setMultiStatementAllow(true);51 wallFilter.setConfig(config);52 returnwallFilter;53 }54 }

完整代码:https://github.com/lucheng/jta.git

其它:

SpringBoot 多数据源配置 https://github.com/lucheng/dynamic.git

SpringBoot 多数据源 + 动态数据源配置:https://github.com/lucheng/dynamicDatasource.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值