精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

性能調優!Spring Boot 選擇正確的事務方式,提升接口響應速度

開發 前端
編程式事務提供了對事務的細粒度控制。它允許開發人員在代碼中明確地定義事務的開始、提交和回滾,從而可以精確地控制事務的邊界和行為。這對于需要精確控制事務邏輯的場景非常有用,例如在復雜的業務邏輯中,可能需要根據不同的條件來決定是否提交或回滾事務。

環境:SpringBoot2.7.18

1. 編程方式與聲明方式

聲明式工作中用的最多,因為太過方便,你甚至都不需要做任何的配置。

@Transactional
public void save() {
  // todo
}

編程方式,用的相對較少,因為比起聲明式要麻煩點(寫的代碼多了);但是如果能結合適當的場景那么這種編程的方式會給你系統代理性能的提升。

@Resource
private TransactionTemplate template ;


public void save() {
  // todo
  template.execute(new TransactionCallback<Object>() {
    public Object doInTransaction(TransactionStatus status) {
       // todo
    }
  } ;
  // todo
}

上面兩種對事務的使用方式非常明顯大家一般都不會選擇使用編程的方式。

編程事務應用場景

  • 細粒度控制:編程式事務提供了對事務的細粒度控制。它允許開發人員在代碼中明確地定義事務的開始、提交和回滾,從而可以精確地控制事務的邊界和行為。這對于需要精確控制事務邏輯的場景非常有用,例如在復雜的業務邏輯中,可能需要根據不同的條件來決定是否提交或回滾事務。
  • 非標準事務管理:當事務管理邏輯不符合標準的事務模型時,編程式事務是一個很好的選擇。例如,在某些特殊情況下,可能需要在一個方法中執行多個數據庫操作,并且這些操作需要被劃分到不同的事務中。在這種情況下,如果使用了聲明式事務只能控制一個數據源,沒法對多個數據源進行控制。這里只是舉例,這種情況屬于分布式事務了,應該考慮如何保證事務的一致性了。

聲明式事務應用場景

  • 簡化事務管理:聲明式事務通過注解定義事務規則,使得事務管理變得簡化。它不需要在業務邏輯代碼中顯式地編寫事務管理的代碼,從而減少了代碼的復雜性。
  • 標準事務管理:聲明式事務通常用于標準的事務管理場景,例如數據庫的增刪改查操作。它提供了對事務的自動管理,包括自動提交和回滾事務,從而減少了開發人員對事務管理的關注。

2. 編程式事務應用

Spring提供了2中編程式的事務管理方式:

  • 使用TransactionTemplate 或 TransactionalOperator
  • 通過 TransactionManager

注意:TransactionTemplate是在命令式中使用,TransactionalOperator是在反應式中使用。

2.1 TransactionTemplate

在Spring Boot中如果你引入了如:data-jpa或者data-jdbc、data-r2dbc相關的依賴后,系統會自動的為我們配置TransactionTemplate或TransactionalOperator

源碼如下:

@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(ReactiveTransactionManager.class)
public TransactionalOperator transactionalOperator(ReactiveTransactionManager transactionManager) {
  return TransactionalOperator.create(transactionManager);
}


@Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(PlatformTransactionManager.class)
public static class TransactionTemplateConfiguration {
  @Bean
  @ConditionalOnMissingBean(TransactionOperations.class)
  public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
    return new TransactionTemplate(transactionManager);
  }
}

TransactionTemplate完整使用示例:

@Resource
private TransactionTemplate template ;
@Resource
private JdbcTemplate jdbcTemplate ;
public void save(Person person) {
  template.execute(new TransactionCallback<Object>() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
      try {
        int result = jdbcTemplate.update("insert into t_person (age, name) values (?, ?)", person.getAge(), person.getName());
      } catch (Exception e) {
        e.printStackTrace() ;
        // 當發生異常后設置為回滾
        status.setRollbackOnly() ;
      }
      return "success"
    }
  }) ;
}

上面示例是有返回值的情況,如果你不需要返回值則可以將TransactionCallback替換為TransactionCallbackWithoutResult 。

屬性配置

public class PersonService {


  private final TransactionTemplate transactionTemplate ;


  public PersonService(PlatformTransactionManager transactionManager) {
    this.transactionTemplate = new TransactionTemplate(transactionManager);
    // 設置事務的隔離級別  
    this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
    // 設置事務超時時間
    this.transactionTemplate.setTimeout(30); // 30 seconds
  }
}

注意:你最好不要使用Spring容器自動配置的TransactionTemplate來進行相關屬性的配置,因為這是全局的,所有的操作都將使用這一份配置。

2.2 TransactionalOperator

方式1:

public class UserService {


  @Resource
  private R2dbcEntityTemplate template ;
  private final TransactionalOperator transactionalOperator;


  public UserService(ReactiveTransactionManager transactionManager) {
    this.transactionalOperator = TransactionalOperator.create(transactionManager);
  }


  public Mono<User> save(User user) {
    return Mono.just(user)
    .then(template.insert(user))
    .doOnNext(u -> {
      // 人為的制造異常
      System.out.println(1 / 0) ;
    })
    .as(transactionalOperator::transactional);
  }
}

在一個事務的上下文中運行。上面代碼執行后你將在控制臺看到事務回滾信息。

圖片圖片

如果沒有上面的as(transactionalOperator::transactional)操作,那么數據將會被正常的插入到數據庫中。

方式2:

public Flux<Integer> save2(User user) {
  return this.transactionalOperator.execute(new TransactionCallback<Integer>() {
    @Override
    public Mono<Integer> doInTransaction(ReactiveTransaction status) {
      return Mono.just(user)
          .then(template.insert(user))
          .doOnNext(u -> {
            System.out.println(1 / 0) ;
          })
          .doOnError(RuntimeException.class, e -> status.setRollbackOnly())
          .map(User::getUid) ;
    }
  }) ;
}

2.3 TransactionManager

public void save() {
  Person person = new Person();
  person.setAge(36);
  person.setName("張三");
  DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
  definition.setName("CustomTx") ;
  definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED) ;
  definition.setReadOnly(false) ;
  definition.setTimeout(2) ;
  TransactionStatus transactionStatus = tm.getTransaction(definition) ;
  try {
    jdbcTemplate.update("insert into t_person (age, name) values (?, ?)", person.getAge(), person.getName());
    // 制造異常
    System.out.println(1 / 0) ;
    // 提交
    tm.commit(transactionStatus) ;
  } catch (Exception e) {
    e.printStackTrace() ;
    // 回滾
    tm.rollback(transactionStatus) ;
  }
}

3. 性能對比(錯誤的應用事務)

數據庫連接配置

圖片圖片

為了看到更好的效果,這里只配置了5個連接。

3.1 基于注解方式

業務方法

@Transactional
public void save(Person person) {
  try {
    // 模擬針對Person執行其它非事務耗時操作
    TimeUnit.SECONDS.sleep(1) ;
  } catch (InterruptedException e) {}
  this.personRepository.saveAndFlush(person) ;
}

通過jmeter測試;

線程池配置

圖片圖片

測試結果

圖片圖片

吞吐量非常低,并且還出現了錯誤。該錯誤是由于在30s內沒有獲取到數據庫連接。

圖片圖片

3.2 基于編程方式

業務方法

public void save(Person person) {
  try {
    // 模擬針對Person執行其它非事務耗時操作
    TimeUnit.SECONDS.sleep(1) ;
  } catch (InterruptedException e) {}
  this.transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      personRepository.saveAndFlush(person) ;
    }
  }) ;
}

jmeter配置不變,測試結果。

圖片

吞吐量大幅提升,并且沒有出現錯誤情況。

從上面的測試結果能夠充分的說明合理的使用事務方式在有些場景下是能夠非常明顯提升系統的整體性能。

總結:非事務性的操作應該拿到事務外執行,要么選擇編程事務。

責任編輯:武曉燕 來源: Springboot實戰案例錦集
相關推薦

2014-03-31 16:15:47

移動應用優化

2024-07-23 08:08:18

2019-12-09 09:34:47

緩存響應數據

2021-01-08 09:40:40

優化VUE性能

2024-12-10 00:00:05

2009-06-16 15:04:14

JSP頁面響應速度

2024-08-01 09:10:03

2025-01-16 10:48:40

2025-02-19 13:00:00

移動端觸摸事件響應速度JavaScrip

2016-02-15 10:52:46

視頻會議華為

2024-02-01 09:51:17

數據庫緩存

2023-09-19 10:31:09

算法數據

2022-02-22 16:21:04

Windows 11微軟

2011-08-29 17:16:29

Ubuntu

2011-03-10 14:40:54

LAMPMysql

2020-02-26 15:35:17

Spring Boot項目優化JVM調優

2017-07-21 08:55:13

TomcatJVM容器

2020-01-14 09:13:48

Tomcat調優配置

2022-06-13 09:45:51

Hook技術移動應用響應速度

2010-05-13 09:49:08

MySQL調優
點贊
收藏

51CTO技術棧公眾號

国产又大又黑又粗| 东京热无码av男人的天堂| 色yeye免费人成网站在线观看| 国产乱码精品1区2区3区| 日韩视频免费在线| 日本人妻一区二区三区| 91精品论坛| 中文字幕在线一区| 99精品国产高清一区二区| 国产成人自拍视频在线| 日韩国产一区| 亚洲电影天堂av| 美女网站色免费| 99爱在线视频| 综合激情成人伊人| 久久久99国产精品免费| 亚洲一级片免费看| 在线亚洲免费| 欧美日韩第一页| 欧美激情 一区| 狠狠综合久久av一区二区| 99精品热6080yy久久| 久久九九国产精品怡红院 | 久草网视频在线观看| 偷窥自拍亚洲色图精选| 日韩一区二区在线免费观看| 六月丁香婷婷在线| 黄污视频在线观看| 亚洲欧美影音先锋| 欧美极品一区二区| 肥臀熟女一区二区三区| 激情五月婷婷综合网| 日本午夜在线亚洲.国产| 国产亚洲精品码| 自拍偷拍欧美| 日韩在线播放av| 亚洲色图欧美色| 视频一区欧美| 亚洲人成在线播放| 超碰97人人干| 久9re热视频这里只有精品| 91精品国产免费| 亚洲欧美国产中文| 91精品国产66| 欧美探花视频资源| 久久久久国产精品熟女影院| 黄色软件视频在线观看| 亚洲成av人**亚洲成av**| 久久免费一级片| 国产激情在线| 亚洲人成精品久久久久久| 亚洲欧美日韩精品久久久| 黄色在线播放| 国产日产欧美一区二区三区| 牛人盗摄一区二区三区视频| 少妇高潮一区二区三区99小说| 懂色av一区二区在线播放| 亚洲自拍偷拍一区| av在线资源观看| 国产精品一区二区91| 91久久极品少妇xxxxⅹ软件| 亚洲AV无码精品国产| 国产精品一区免费在线观看| 亚洲一区二区三区在线免费观看| 999免费视频| 国产成人精品免费视频网站| 动漫一区二区在线| 三级网站免费观看| 久久久久久久久久电影| 日韩av一级大片| 三区四区在线视频| 亚洲精品乱码久久久久久黑人| 黄色成人在线免费观看| 九九色在线视频| 精品久久久久久久久中文字幕| 日韩人妻精品无码一区二区三区| 不卡福利视频| 欧美日韩在线播放三区四区| 亚洲制服中文字幕| 国产精品45p| 亚洲第一男人天堂| 丰满少妇高潮一区二区| 日韩一区三区| 欧美激情亚洲一区| 天天干天天色综合| 国产在线日韩欧美| 激情五月综合色婷婷一区二区| 国产中文字幕在线| 亚洲精品高清在线观看| 欧美日韩国产精品激情在线播放| 福利一区在线| 精品久久久久久久久久久久包黑料| 国产日本欧美在线观看| 无码人妻精品一区二区三区在线 | 国产日韩欧美a| 成人在线免费高清视频| 综合日韩av| 7777精品伊人久久久大香线蕉完整版 | 青青操国产视频| 亚洲一区二区动漫| 成人黄色在线播放| 亚洲av成人无码久久精品老人| 国产精品免费视频网站| 欧美图片激情小说| 九七影院97影院理论片久久| 精品久久久久一区二区国产| 一级片视频免费看| 亚洲国产电影| 成人久久久久爱| 国产一级二级三级在线观看| 亚洲免费观看高清| 青青在线视频免费| 国产欧美三级电影| 久久伊人精品天天| 黄色一区二区视频| 99国内精品久久| 免费的一级黄色片| 在线视频成人| 亚洲一区二区久久| 国产 日韩 欧美 在线| 国产综合色在线| 日韩一区二区三区资源| av毛片午夜不卡高**水| 91精品国产麻豆| 亚洲天堂岛国片| 国产欧美69| 国产精品一区二区三区四区五区| 久草免费在线| 欧美视频一区二区| 一级黄色片大全| 亚洲三级毛片| 国产精品久久精品视| 成人日批视频| 91精品欧美久久久久久动漫 | 欧美hd在线| 国产成人精品久久亚洲高清不卡| 天天操天天干天天爽| 一区二区三区在线视频免费观看| 手机av在线免费| 日韩国产一区| 国产日韩av在线| 日本在线看片免费人成视1000| 欧洲精品一区二区三区在线观看| 熟女人妻在线视频| 国产视频一区免费看| 国产无套精品一区二区| sm国产在线调教视频| 欧美放荡的少妇| 免费国产羞羞网站美图| 国产一区中文字幕| 久久视频免费在线| 亚洲一区二区电影| 欧美激情中文字幕乱码免费| 亚洲精品国产手机| 午夜成人免费视频| 亚洲最大的黄色网| 水蜜桃久久夜色精品一区的特点| 欧美区高清在线| 日韩精选视频| 中文字幕日韩有码| 国产免费黄色网址| 亚洲综合在线第一页| 精品1卡二卡三卡四卡老狼| 亚洲伦理一区| 欧美黑人3p| 国产成人午夜性a一级毛片| 深夜福利一区二区| 99久久精品国产色欲| 亚洲成av人片一区二区| www.久久国产| 精品一区二区精品| www.国产二区| 伊人久久大香线蕉av不卡| 国产精品91一区| a篇片在线观看网站| 亚洲成av人片在线观看香蕉| 午夜婷婷在线观看| 国产精品久久久久7777按摩| 久久精品无码一区二区三区毛片| 在线欧美亚洲| 少妇免费毛片久久久久久久久| 青草综合视频| 97在线日本国产| 成黄免费在线| 精品久久久久久最新网址| www.国产毛片| 亚洲精品大片www| 亚洲AV无码片久久精品| 国产精品99久久久| 国产精品免费成人| 欧美+亚洲+精品+三区| 精品在线一区| 成人免费观看49www在线观看| 国内外成人免费激情在线视频网站| 久久久久久久影视| 91精品国产欧美日韩| 欧美a视频在线观看| 亚洲日穴在线视频| 色婷婷av777| 国产成人av一区二区| www.色偷偷.com| 亚洲精品日韩久久| 吴梦梦av在线| 国产伦精品一区二区三区视频| 亚洲一区二区中文| 成人看片网站| 777777777亚洲妇女| 欧美成人精品一区二区男人看| 日韩欧美中文字幕精品| 综合久久中文字幕| 精品国产乱码久久久久久天美| 日本少妇aaa| 久久久国产精华| 中文字幕精品视频在线| 国产精品一区专区| 日日躁夜夜躁aaaabbbb| 久久九九电影| 欧美成人精品免费| 永久亚洲成a人片777777| 日韩国产高清一区| 日韩在线麻豆| 国产精品一区二区免费| 日韩精品一区二区三区中文字幕| 国产精品美女久久久久av超清| 波多野结衣乳巨码无在线观看| 日韩一区二区三区在线播放| 超碰国产在线| 亚洲男人天堂久| 五月婷婷综合久久| 精品99一区二区| 亚洲av无码一区二区乱子伦| 制服丝袜亚洲网站| 中文字幕在线天堂| 色婷婷av一区二区三区之一色屋| 日本一区二区三区四区五区| 亚洲国产wwwccc36天堂| 免费中文字幕视频| 亚洲精品日产精品乱码不卡| 亚洲女人久久久| 中文字幕日韩一区| 亚洲 欧美 变态 另类 综合| 国产精品美女视频| 久久日免费视频| 国产精品免费aⅴ片在线观看| 欧美人与性囗牲恔配| 国产欧美日韩一区二区三区在线观看 | 热久久最新地址| 欧美91大片| 日韩精品一区二区三区四| 国内精品美女在线观看| 日本男女交配视频| 亚洲第一黄网| 成人免费aaa| 久久一区欧美| 91日韩视频在线观看| 久久国产精品色| 亚欧精品在线视频| 国产不卡视频一区二区三区| 国产乱国产乱老熟300部视频| 成人免费看黄yyy456| yy6080午夜| 国产亚洲va综合人人澡精品 | 欧美xxav| 日本国产中文字幕| 亚洲一区二区伦理| 2025韩国理伦片在线观看| 国产一区高清在线| 免费a v网站| 亚洲国产成人在线| 国产一区二区视频在线观看免费| 亚洲一卡二卡三卡四卡无卡久久| 日韩精品成人在线| 欧亚洲嫩模精品一区三区| 亚洲视频一区在线播放| 日韩欧美在线1卡| 午夜视频在线免费播放| 在线精品高清中文字幕| caopen在线视频| 欧美怡红院视频一区二区三区| 日韩一区精品| 成人黄动漫网站免费| 亚洲日本三级| 一区二区三区日韩视频| 亚洲另类自拍| 特级西西444www| 久久伊99综合婷婷久久伊| 中文字幕观看av| 偷拍与自拍一区| 一级黄色大毛片| 亚洲国产婷婷香蕉久久久久久| 成人免费在线电影| 色综合视频一区中文字幕| **欧美日韩在线观看| 91传媒免费看| 国产一区二区三区四区五区传媒| 国产欧美自拍视频| 日韩国产欧美一区二区三区| 中文字幕一区二区在线观看视频 | 正在播放国产对白害羞| 亚洲永久精品大片| 亚洲av综合一区| 亚洲国产高清福利视频| 亚洲视频tv| 日本精品久久久| 在线一区二区三区视频| 亚洲精品日韩在线观看| 亚洲综合99| 欧美午夜精品一区二区| 国产欧美一区二区精品性色超碰| 黄网站免费在线| 91精品国产综合久久精品| 国产youjizz在线| 97在线看免费观看视频在线观看| 国语精品视频| 亚洲欧洲另类精品久久综合| 一区二区动漫| av漫画在线观看| 亚洲免费电影在线| 亚洲视频久久久| 一个色综合导航| 成人福利av| 久久精品国产综合精品| 欧美三级乱码| 日日夜夜精品视频免费观看 | 中文字幕一区二区三区最新| 久久亚洲风情| 人妻熟女aⅴ一区二区三区汇编| 亚洲最新在线观看| 国产白浆在线观看| 久久中文字幕在线视频| 欧美成人福利| 亚洲精品一区二区三区樱花| 丝袜诱惑制服诱惑色一区在线观看| 成人做爰www看视频软件| 一区二区三区国产豹纹内裤在线| 国产一区二区小视频| 中日韩美女免费视频网站在线观看| 免费福利视频一区二区三区| 九色91在线视频| 亚洲深夜激情| 波多野结衣办公室33分钟| 一本色道亚洲精品aⅴ| 日韩二区三区| 青草青草久热精品视频在线观看| 四虎影视精品| 成年人视频网站免费观看| 99r精品视频| 欧美日韩一二三四区| 亚洲免费视频网站| 欧美成a人片在线观看久| 日本一区二区三区精品视频| 日韩影院在线观看| av男人的天堂av| 欧美中文字幕一二三区视频| 91成人高清| 91视频国产精品| 激情综合视频| 国产乱了高清露脸对白| 日韩欧美精品中文字幕| 国产h在线观看| 91在线国产电影| 好看的日韩av电影| 日韩aaaaa| 在线一区二区三区四区五区| 91欧美在线视频| 亚洲一区二区久久久久久久| 在线欧美亚洲| 最新中文字幕av| 在线91免费看| 波多野结衣乳巨码无在线观看| 欧美精品二区三区四区免费看视频 | 国产精品区在线观看| 久久久成人精品视频| 凹凸av导航大全精品| 少妇性饥渴无码a区免费| 国产精品久久久久7777按摩| 成人毛片在线精品国产| 琪琪第一精品导航| 一区二区中文| 特级西西人体wwwww| 欧美三级中文字幕| 欧美aaaaaaa| 日韩亚洲不卡在线| 国产v综合v亚洲欧| 无码人妻精品一区二区三区不卡| 日韩视频在线免费观看| 国产精品17p| 午夜免费福利视频在线观看| 亚洲亚洲精品在线观看| 成人高清免费观看mv| 97影院在线午夜| 日韩制服丝袜先锋影音| 久久久一二三区| 中文国产亚洲喷潮| 久久久久观看| www.国产福利| 日本精品一区二区三区四区的功能| 爆操欧美美女| 亚洲欧洲精品一区| 成人99免费视频|