精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品久久久久久久美男| 91.com在线观看| 精品欧美一区二区久久久伦| 久久久久久久伊人| 欧美大胆视频| 色女孩综合影院| 亚洲成人网上| 国产一区二区三区四区视频| 欧美三级乱码| 精品亚洲va在线va天堂资源站| 欧美日韩在线不卡视频| 成年人在线观看| 激情欧美一区二区| 欧美放荡办公室videos4k| 97人妻精品一区二区三区免费 | 中文字幕成人一区| 无码人妻av免费一区二区三区| 亚洲熟妇一区二区三区| 成人免费网址| 不卡的电视剧免费网站有什么| 久久综合伊人77777蜜臀| 成人做爰69片免费| 日韩大尺度黄色| 国产精品国产三级国产aⅴ无密码| 91美女福利视频高清| 日韩欧美激情视频| 91免费精品| 日韩国产欧美区| 欧美成人乱码一二三四区免费| 免费网站在线观看人| 国产日韩欧美亚洲| 国产精品一区视频| 一区二区国产欧美| 午夜亚洲一区| 欧美激情a在线| 毛片久久久久久| 日韩欧美黄色| 日韩一卡二卡三卡四卡| 免费人成自慰网站| 色网站免费在线观看| 国产传媒久久文化传媒| 国产精品一区二区3区| 丰满少妇乱子伦精品看片| 91成人网在线观看| 中文字幕av一区二区三区谷原希美| 污污污www精品国产网站| 祥仔av免费一区二区三区四区| 一区二区在线免费| 日韩精品久久久| 亚洲 国产 欧美 日韩| 国产很黄免费观看久久| 国产欧美一区二区三区在线| 日日骚av一区二区| 亚洲精一区二区三区| 欧美成年人视频| 男女全黄做爰文章| 菠萝蜜一区二区| 国产香蕉一区二区三区在线视频 | 色女孩综合网| 色播色播色播色播色播在线 | 国产精品免费无遮挡| 石原莉奈在线亚洲二区| 51精品国产黑色丝袜高跟鞋 | 五月综合激情网| 一二三在线视频| 成人高清免费在线| 亚洲欧美综合网| 亚洲一区精彩视频| jizz亚洲| 国产精品色哟哟| 涩涩涩999| av男人的天堂在线| 国产精品久久久久永久免费观看 | 日批视频免费观看| 日韩高清在线一区| 国产精品久久视频| 夜夜嗨aⅴ一区二区三区| 青青国产91久久久久久| 国产精品88a∨| 免费一级a毛片| 免费看黄色91| 成人高清视频观看www| 亚洲一区二区三区网站| 蜜桃视频免费观看一区| 国产在线视频不卡| 中文字幕在线播放日韩| 精品一区二区免费| 亚洲一区二区三区四区在线播放 | 99久热re在线精品视频| 精品久久国产视频| 懂色一区二区三区免费观看 | 中文字幕一区二区免费| 久久精品免费看| 国产亚洲精品美女久久久m| 九色国产在线观看| 亚洲欧洲综合另类| 国产中文字幕视频在线观看| 欧美一区二区三区婷婷| 亚洲高清av在线| 夫妇露脸对白88av| 亚洲狼人精品一区二区三区| 国产精自产拍久久久久久| 成人午夜视频一区二区播放| 国产三级精品视频| 精品国偷自产一区二区三区| 欧美日韩在线精品一区二区三区激情综合 | 在线观看国产黄| 不卡视频在线观看| 不卡中文字幕在线| 台湾佬成人网| 欧美成人精品福利| 国产免费嫩草影院| 国产精品久久久亚洲一区| 91久久国产婷婷一区二区| 十九岁完整版在线观看好看云免费| 综合电影一区二区三区| 欧美日韩亚洲一二三| 国产日韩三级| 久久夜色精品亚洲噜噜国产mv| 九九精品免费视频| 国产xxx精品视频大全| 在线精品日韩| 99精品国自产在线| 亚洲欧美成人在线| 久久久久噜噜噜亚洲熟女综合| 日本欧美一区二区| 裸模一区二区三区免费| 91www在线| 欧美大片免费久久精品三p | 国产精品不卡| 国产精品免费观看在线| 欧洲视频在线免费观看| 欧美日韩性生活视频| 国产精品91av| 综合久久99| 成人国产精品日本在线| av在线收看| 欧美亚洲动漫精品| 亚洲永久精品ww.7491进入| 亚洲精选国产| 精品一区在线播放| 免费毛片b在线观看| 亚洲电影在线观看| 欧美不卡视频在线观看| 成人免费观看视频| 2018日日夜夜| 欧美黑人巨大videos精品| 国内精品久久久久久久久| 亚洲精品久久久蜜桃动漫| 亚洲免费电影在线| 人妻激情偷乱视频一区二区三区| 国产精品99久久久久久动医院| 成人写真视频福利网| 日本蜜桃在线观看| 91精品久久久久久久91蜜桃| 一区二区三区四区五区| 国产乱码精品一区二区三区av | 天堂网av2018| 狠狠色综合色综合网络| 黄色网址在线免费看| 精品国产亚洲一区二区三区在线 | 亚洲精品国产精品国自产在线| 国产成人在线播放视频| 91麻豆国产自产在线观看| 欧美视频在线播放一区| 精品国产乱码久久久久久蜜坠欲下| 97婷婷涩涩精品一区| 日韩一级免费毛片| 午夜av一区二区| 免费视频91蜜桃| 精品午夜久久福利影院| 久久99久久久久久| 日韩大片在线免费观看| 日本一区二区三区四区视频| 91精品国产综合久久久久久豆腐| 欧美精品国产精品| 香蕉视频一区二区| 国产日韩欧美电影| 青娱乐国产精品视频| 亚洲精品裸体| 亚洲精品久久区二区三区蜜桃臀| 亚洲三级av| 日本一区二区不卡| 2024短剧网剧在线观看| 日韩av在线免费观看| 成人黄色激情视频| 亚洲资源中文字幕| 黄色片在线观看免费| 国产乱码精品1区2区3区| 久久久久久久久久久视频| 成人情趣视频网站| 国内一区在线| 亚洲伦理一区二区| 91国在线精品国内播放| 日本黄色片在线观看| 亚洲第一在线视频| 又骚又黄的视频| 婷婷开心久久网| 亚洲精品自拍视频在线观看| 99国产麻豆精品| 日韩va在线观看| 天堂一区二区在线免费观看| 日本大胆人体视频| 精品久久久久久久久久久下田| 96成人在线视频| 日韩经典一区| 91国偷自产一区二区三区的观看方式| 日韩伦理在线观看| 亚洲精品一区中文字幕乱码| 国产三级小视频| 91久久免费观看| 日韩精品视频免费播放| 日韩一区日韩二区| 国内精品卡一卡二卡三| 成人午夜激情影院| 亚洲成人手机在线观看| 日韩精品久久理论片| 亚洲熟妇av日韩熟妇在线| 伊人色**天天综合婷婷| 亚洲精品国产精品国自产| 九九久久婷婷| 久久精品国产第一区二区三区最新章节| 国产在线一区不卡| 国产精品日日做人人爱| 经典三级一区二区| 欧美在线视频导航| 波多野结衣在线播放| 另类色图亚洲色图| 看女生喷水的网站在线观看| 亚洲天堂av电影| 日本亚洲一区| 亚洲精品日韩久久久| 色一情一乱一乱一区91av| 日韩一二三区视频| 超碰福利在线观看| 亚洲av无码不卡| 色婷婷国产精品久久包臀| 日韩三级小视频| 午夜精品免费在线观看| 日韩av在线播| 婷婷综合久久一区二区三区| 日韩精品一区二区av| 午夜av一区二区| 免费观看一区二区三区毛片| 偷拍与自拍一区| wwwwww国产| 色哟哟在线观看一区二区三区| 特黄视频免费看| 色网综合在线观看| 国产第一页在线观看| 欧美自拍偷拍午夜视频| 黄色大全在线观看| 欧美色综合影院| 97成人免费视频| 日韩一级欧美一级| 不卡的日韩av| 日韩精品电影网| 成人精品一区二区| 日韩一区二区三区国产| 菠萝菠萝蜜在线观看| 色综合久久精品亚洲国产| 俺来俺也去www色在线观看| 97在线视频免费看| 欧美亚洲韩国| 91精品美女在线| 亚洲精品观看| 久久久久资源| 日韩伦理视频| 日本免费成人网| 久久都是精品| 欧美一级xxxx| 高清在线不卡av| 免费观看av网站| 国产精品第五页| 久久久久久久久久久久久久免费看 | 国产乱论精品| 日韩av在线电影观看| 婷婷综合视频| 国产69精品久久久久999小说| 久久久一二三| 杨幂一区二区国产精品| av色综合久久天堂av综合| 国产黄色录像视频| 亚洲高清在线视频| 正在播放亚洲精品| 欧美精品一区二区三区久久久| 国产在线视频网| 欧美国产视频一区二区| 制服诱惑亚洲| 成人综合色站| 不卡在线一区| 国产av麻豆mag剧集| 精品一区二区三区香蕉蜜桃| 国产精品果冻传媒| 欧美激情一区在线| 日本熟妇乱子伦xxxx| 欧美在线高清视频| 色婷婷av一区二区三| 久久天天躁狠狠躁夜夜躁| 亚洲天堂手机| 999国产视频| 不卡一区综合视频| 久久免费视频3| 国产成人午夜精品影院观看视频 | 欧美日韩精品一区二区在线播放 | 尤物九九久久国产精品的分类| 怡红院红怡院欧美aⅴ怡春院| 国产99久久久欧美黑人| 1313精品午夜理伦电影| 一区二区免费在线视频| 欧美专区一区二区三区| 精品少妇人妻av一区二区三区| 欧美韩日一区二区三区四区| 久久不卡免费视频| 日韩精品专区在线影院观看| 91社区在线| 国产精品久久9| 你懂的一区二区三区| 东北少妇不带套对白| 国产伦精品一区二区三区视频青涩| 国产精品天天干| 欧美视频免费在线| 人妻无码中文字幕| 欧美高清视频在线| 国产一区二区高清在线| 亚洲精品一区二区三| 三级欧美在线一区| 毛片网站免费观看| 欧美日韩在线一区| 污视频在线免费观看| 欧美激情国产精品| 欧美视频二区欧美影视| 一级黄色录像免费看| 韩日欧美一区二区三区| 成年人网站在线观看视频| 欧美色大人视频| 91福利在线视频| 国产精选久久久久久| 国产精品99一区二区三| 亚洲第一成肉网| 亚洲人成网站精品片在线观看| 国产一区二区三区四区视频 | 狠狠色狠狠色合久久伊人| 亚洲欧美卡通动漫| 在线播放视频一区| 麻豆免费在线视频| 99国精产品一二二线| 欧美国产专区| 久久久久亚洲无码| 精品女厕一区二区三区| 可以免费看污视频的网站在线| 青青草99啪国产免费| 国内精品久久久久久久影视简单 | 国产精品毛片aⅴ一区二区三区| 欧美一级免费在线观看| 国产一区二区0| 国产黄色片视频| 日韩精品福利在线| 欧美日韩在线精品一区二区三区激情综合 | 在线一区二区三区四区五区| 1769视频在线播放免费观看| 国产深夜精品福利| 欧美1区视频| 欧美肉大捧一进一出免费视频| 欧美性猛交xxxx乱大交| 成人影院免费观看| 亚洲一区二区三区四区视频| 亚洲精品人人| www.av天天| 欧美一区三区二区| 超碰资源在线| 天天好比中文综合网| 国产精品综合久久| 久草精品视频在线观看| 亚洲视频电影图片偷拍一区| 欧美视频免费看| 大西瓜av在线| 欧美国产1区2区| 亚洲欧美黄色片| 国产成人亚洲综合青青| 先锋资源久久| 精品夜夜澡人妻无码av| 欧美日韩1234| 电影在线观看一区| 亚洲无玛一区| 成人免费高清视频| 欧美一级黄视频| 久久免费视频网站| 99精品网站| 免费无码一区二区三区| 欧美另类z0zxhd电影| 福利影院在线看| 99精品一区二区三区的区别| 91天堂素人约啪| 国产毛片在线视频| 日韩免费视频在线观看| 欧美xxx在线观看| 国产馆在线观看| 亚洲国产精品国自产拍av秋霞 | 欧美精品成人一区二区三区四区|