<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 一、整合jta-atomikos 首先需要引入jta的依賴包,注意是JTA(事務管理),不是JPA。 ~~~ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency> ~~~ 雙數據源配置。刪掉原有其他的數據庫連接配置.兩個數據源的名稱分別是:primary和secondary。分別訪問testdb和testdb2數據庫。另外注意:驅動類是MysqlXADataSource(支持分布式事務),而不是MysqlDataSource。 ~~~ primarydb: uniqueResourceName: primary xaDataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlXADataSource xaProperties: url: jdbc:mysql://192.168.1.91:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false user: test password: 4rfv$RFV exclusiveConnectionMode: true minPoolSize: 3 maxPoolSize: 10 testQuery: SELECT 1 from dual #由于采用HikiriCP,用于檢測數據庫連接是否存活。 secondarydb: uniqueResourceName: secondary xaDataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlXADataSource xaProperties: url: jdbc:mysql://192.168.1.91:3306/testdb2?useUnicode=true&characterEncoding=utf-8&useSSL=false user: test password: 4rfv$RFV exclusiveConnectionMode: true minPoolSize: 3 maxPoolSize: 10 testQuery: SELECT 1 from dual #由于采用HikiriCP,用于檢測數據庫連接是否存活。 ~~~ ## 二、配置多數據源及事務管理 數據源DataSource、SqlSessionFactory、SqlSessionTemplate、掃描路徑,對于primarydb和secondarydb都是自己一套,需要分別配置。 數據源一:primarydb ~~~ @Configuration @EnableConfigurationProperties @EnableAutoConfiguration @MapperScan(basePackages = "com.zimug.bootlaunch.generator.testdb", //注意這里 sqlSessionTemplateRef = "primarySqlSessionTemplate") public class PrimaryDataSourceJTAConfig { @Bean("primaryDataSource") @ConfigurationProperties(prefix = "primarydb") public DataSource primaryDataSource() { return new AtomikosDataSourceBean(); } @Bean("primarySqlSessionFactory") public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //因為Mapper和Mapper.xml我放在同一個文件夾所以不用設資源路徑 //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); bean.setTypeAliasesPackage("com.zimug.bootlaunch.generator.testdb"); //這里需要修改為你的掃描類路徑 return bean.getObject(); } @Bean("primarySqlSessionTemplate") public SqlSessionTemplate primarySqlSessionTemplate( @Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ~~~ 數據源二:secondarydb。參照數據源一,將primary修改為secondary再配置一組。 ~~~ @Configuration @EnableConfigurationProperties @EnableAutoConfiguration @MapperScan(basePackages = "com.zimug.bootlaunch.generator.testdb2", //注意這里 sqlSessionTemplateRef = "secondarySqlSessionTemplate") public class SecondaryDataSourceJTAConfig { @Bean("secondaryDataSource") @ConfigurationProperties(prefix = "secondarydb") @Primary public DataSource secondaryDataSource() { return new AtomikosDataSourceBean(); } @Bean("secondarySqlSessionFactory") @Primary public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); bean.setTypeAliasesPackage("com.zimug.bootlaunch.generator.testdb2"); //注意這里 return bean.getObject(); } @Bean("secondarySqlSessionTemplate") @Primary public SqlSessionTemplate secondarySqlSessionTemplate( @Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } } ~~~ 雖然我們將數據源及其相關配置分成了兩組,但這兩組數據源使用的事務管理器必須是同一個,這樣才能實現分布式事務。下面是事務管理器的配置。固定代碼,一點不用改,不要糾結。不需要問張三為什么叫張三,因為他爸爸就是這么給他起名的。 ~~~ @Configuration @EnableTransactionManagement public class XATransactionManagerConfig { //User事務 @Bean(name = "userTransaction") public UserTransaction userTransaction() throws Throwable { UserTransactionImp userTransactionImp = new UserTransactionImp(); userTransactionImp.setTransactionTimeout(10000); return userTransactionImp; } //分布式事務 @Bean(name = "atomikosTransactionManager", initMethod = "init", destroyMethod = "close") public TransactionManager atomikosTransactionManager() throws Throwable { UserTransactionManager userTransactionManager = new UserTransactionManager(); userTransactionManager.setForceShutdown(false); return userTransactionManager; } //事務管理器 @Bean(name = "transactionManager") @DependsOn({ "userTransaction", "atomikosTransactionManager" }) public PlatformTransactionManager transactionManager() throws Throwable { return new JtaTransactionManager(userTransaction(),atomikosTransactionManager()); } } ~~~ ## 三、service層測試 將自動生成的代碼,分別存放于testdb和testdb2兩個文件夾 ![](https://box.kancloud.cn/a96cb8e34c72b97cfd56f7322a2613e3_445x293.png) 在Service層模擬異常 ~~~ @Override @Transactional public ArticleVO saveArticle(ArticleVO article) { Article articlePO = dozerMapper.map(article,Article.class); articleMapper.insert(articlePO); Message message = new Message(); message.setName("kobe"); message.setContent("退役啦"); messageMapper.insert(message); int a = 2/0; //認為制造被除數為0的異常 return article; } ~~~ 正常情況下,2組數據分別插入到testdb的article表和testdb2的message表。如果我們人為制造一個異常(如上面代碼),事務回滾,二者均無法插入數據。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看