<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      問:@Async和@Transaction可以一起使用嗎?

       

       在Java中,@Async 和 @Transaction注解是可以一起使用的,但需要注意一些細節和潛在問題。

       

      1. @Async 和 @Transactions 注解

        @Async注解:用于異步執行方法。使用此注解的方法會在單獨線程中執行,而不會阻塞調用線程。在需要執行耗時操作而不希望阻塞主線程時非常有用。

       

        @Transactional注解:用于聲明方法的事務性,通常用于數據庫的操作,以確保方法的執行具有原子性。事務可以控制多個數據庫操作的提交和回滾,以確保數據的一致性。

       

        一起使用注意事項:

         1) 異步方法是在獨立的線程中執行的,而事務是與線程綁定的。故,@Async 注解的方法通常不會繼承調用方線程的事務上下文

          若想在異步方法中使用事務,需要在異步方法內重新開啟一個新的事務(重新定義 @Tranactional)。

         2) 需要確保異步方法通過 Spring 代理調用,不能再同一個類中直接調用,否則異步機制起不到作用。需要通過 Spring 容器獲取的 Bean 來調用這些方法。

       

      2. 示例代碼

        場景:需要從數據庫讀取數據,進行處理,然后將結果異步返回保存數據庫。

          設:從程序中讀取用戶數據,進行處理數據,然后異步將結果保存到另一個表中。(希望數據處理在事務中完成,以確保數據一致性,但希望保存操作是異步的,以提高性能。)

        1) 實體類(用戶和處理后的結果實體類)

      @Entity
      @Data
      public class User {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String name;
          private String email;
      }
      @Entity
      @Data
      public class ProcessedResult {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private Long userId;
          private String resultData;
      }


        2) 定義兩個倉庫接口,訪問數據庫

      @Mapper
      public interface UserMapper extends BaseMapper<User> {
      }
      
      @Mapper
      public interface ProcessedResultMapper extends BaseMapper<ProcessedResult> {
      }

        

        3) 服務類中,結合 @Transactional 和 @Async 注解實現業務邏輯。

      @Service
      public class UserService {
      
          @Autowired
          private UserMapper userMapper;
      
          @Autowired
          private ProcessedResultMapper processedResultMapper;
      
          @Autowired
          private AsyncService asyncService;
      
          @Transactional
          public void processUsers() {
              // 獲取所有用戶
              List<User> users = userMapper.selectList(null);
      
              for (User user : users) {
                  // 數據處理
                  String resultData = processData(user);
      
                  // 異步保存處理結果
                  asyncService.saveProcessedResult(user.getId(), resultData);
              }
          }
      
          private String processData(User user) {
              // 數據處理邏輯
              return "Processed data for user: " + user.getName();
          }
      }

       

        4) 異步服務類。使用 @Async 注解異步保存結果。

      @Service
      public class AsyncService {
      
          @Autowired
          private ProcessedResultMapper processedResultMapper;
      
          @Async
          @Transactional
          public void saveProcessedResult(Long userId, String resultData) {
              // 創建并保存處理結果
              ProcessedResult processedResult = new ProcessedResult();
              processedResult.setUserId(userId);
              processedResult.setResultData(resultData);
              processedResultMapper.insert(processedResult);
      
              System.out.println("保存 processed result 的 user ID: " + userId);
          }
      }

       

        5) 確保在配置類中啟用異步支持。

      @Configuration
      @EnableAsync
      public class AsyncConfig {
      
          /**
           * 定義一個線程池執行器,用于執行標記了 @Async 注解的異步方法。
           * 
           * @return Executor 線程池執行器實例
           */
          @Bean
          public Executor taskExecutor() {
              ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
              executor.setCorePoolSize(2);    // 核心線程數
              executor.setMaxPoolSize(5);    // 最大線程數
              executor.setQueueCapacity(500);    // 任務隊列的容量
              executor.setThreadNamePrefix("AsyncThread-");    // 線程池中線程的名稱前綴
              executor.initialize();    // 初始化線程池
              return executor;
          }
      }

       

        執行流程:

         UserService.processUsers() 方法使用 @Transactional 注解,確保在讀取和處理用戶數據時的事務一致性。
         處理每個用戶,結果通過 AsyncService.saveProcessedResult() 方法異步保存。同時使用 @Transactional 注解,故每次保存操作都在獨立的事務內執行。
         而 saveProcessedResult 方法時異步的,因此不阻塞主線程,從而提高了性能。


      3. 總結

        1) @Transactional 注解主要用于確保數據一致性和操作的原子性。@Async 注解用于提到性能。結合注解使用,需注意事務的上下文的邊界和線程的管理。

        2) 為了獲取性能和一致性,需要在異步方法內部定義新的事務。

       

      posted @ 2024-08-05 20:30  學Java的`Bei  閱讀(677)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 女人香蕉久久毛毛片精品| 靖江市| 国内精品卡一卡二卡三| 在线观看中文字幕码国产| 九九re线精品视频在线观看视频| 日韩有码中文字幕国产| 99中文字幕国产精品| 亚洲成av人片无码天堂下载| 国产中文字幕在线一区| 日韩精品av一区二区三区| 国产亚洲精品久久久久秋霞| 欧美中文字幕无线码视频 | 亚洲成人av高清在线| 国产精品无码成人午夜电影| 国产不卡免费一区二区| 久热这里只有精品视频3| 精品免费看国产一区二区| 中文字幕久久熟女蜜桃| 伊人色综合一区二区三区| 国99久9在线 | 免费| 国产精品国产三级在线专区| 国产成人无码免费看片软件| 性欧美vr高清极品| 调兵山市| 中文字幕 日韩 人妻 无码| 国产亚洲精品第一综合另类灬| 97成人碰碰久久人人超级碰oo| 亚洲日本韩国欧美云霸高清| 最近中文字幕mv免费视频| 久热综合在线亚洲精品| 人妻少妇| 亚洲欧美综合中文| 囯产精品久久久久久久久久妞妞 | 国产91成人亚洲综合在线| 国产乱沈阳女人高潮乱叫老| 中文字幕av无码不卡| 国产精品熟妇视频国产偷人| 亚洲成av人片无码不卡播放器| 在线中文字幕国产一区| 久久综合给合久久狠狠狠| 欧美丰满熟妇xxxx性ppx人交|