国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - SpringBoot一個(gè)提升N倍性能的操作

SpringBoot一個(gè)提升N倍性能的操作

2021-03-18 01:31今日頭條FastCoder架構(gòu)師 Java教程

一般我們?cè)趕pring項(xiàng)目中都是在方法或者是類(lèi)上添加事務(wù)支持,我們?cè)陧?xiàng)目中使用事務(wù)的姿勢(shì)了。這里是方法級(jí)別的事務(wù),當(dāng)方法執(zhí)行的時(shí)候通過(guò)動(dòng)態(tài)代理打開(kāi)事務(wù),執(zhí)行代碼,提交事務(wù)/回滾事務(wù).

SpringBoot一個(gè)提升N倍性能的操作

環(huán)境:springboot2.3.9.RELEASE + JPA + MySQL

一般我們?cè)趕pring項(xiàng)目中都是在方法或者是類(lèi)上添加事務(wù)支持,如下使用方式:

@Transactional 

public Account deduction(Long id, BigDecimal money) { 

        Optional<Account> op = accountDAO.findById(id); 

      if (!op.isPresent()) { 

          throw new RuntimeException("不存在"); 

      } 

      account.setMoney(account.getMoney().subtract(money)) ; 

          return accountDAO.saveAndFlush(account) ; 

以上應(yīng)該是我們?cè)陧?xiàng)目中使用事務(wù)的姿勢(shì)了。這里是方法級(jí)別的事務(wù),當(dāng)方法執(zhí)行的時(shí)候通過(guò)動(dòng)態(tài)代理打開(kāi)事務(wù),執(zhí)行代碼,提交事務(wù)/回滾事務(wù),執(zhí)行的邏輯大體如下:

transaction.begin(); 

method.invoke(xxxx); 

transaction.commit(); / transaction.rollback(); 

在上面舉的示例比較簡(jiǎn)單,整個(gè)操作就是計(jì)算扣減金額,然后更新數(shù)據(jù)。這個(gè)業(yè)務(wù)也就是在保存數(shù)據(jù)的時(shí)候需要使用到事務(wù),其它的一些計(jì)算是不需要在一個(gè)事務(wù)中的。想象下如果我們這里保存操作之上的代碼,計(jì)算邏輯是個(gè)非常復(fù)雜的邏輯可能需要消耗好幾秒甚至是十幾秒而實(shí)際保存操作可能就幾毫秒就完成了。我們又知道這方法級(jí)的事務(wù)在執(zhí)行的時(shí)候是要先獲取一個(gè)Connection對(duì)象(數(shù)據(jù)庫(kù)連接對(duì)象的)然后打開(kāi)事務(wù)(設(shè)置自動(dòng)提交為false,connection.setAutoCommit(false));說(shuō)到這你應(yīng)該能想到,從獲取一個(gè)Connection對(duì)象到釋放需要幾秒甚至是十幾秒的時(shí)間,而占用的這些時(shí)間中大部分的時(shí)間都是與事務(wù)無(wú)關(guān)的操作也就是說(shuō)是不需要事務(wù)的,而我們的數(shù)據(jù)庫(kù)連接對(duì)象本身就是很寶貴及有限的,這就造成了我們系統(tǒng)的資源浪費(fèi),系統(tǒng)的吞吐量非常的低。接下來(lái)我們就來(lái)通過(guò)編程的方式控制事務(wù)提供系統(tǒng)的吞吐量。

模擬常規(guī)的事務(wù),展現(xiàn)低吞吐量操作

數(shù)據(jù)庫(kù)連接配置:

spring: 

  datasource: 

    driverClassName: com.mysql.cj.jdbc.Driver 

    url: jdbc:mysql://localhost:3306/x?serverTimezone=GMT%2B8 

    username: root 

    password: xxxx 

    type: com.zaxxer.hikari.HikariDataSource 

    hikari: 

      minimumIdle: 1 

      maximumPoolSize: 1 

      autoCommit: true 

      idleTimeout: 30000 

      poolName: MasterDatabookHikariCP 

      maxLifetime: 1800000 

      connectionTimeout: 30000 

      connectionTestQuery: SELECT 1 

這里把數(shù)據(jù)庫(kù)連接池配置為1個(gè)。

Service中模擬耗時(shí)的操作

@Transactional 

public Account deduction(Long id, BigDecimal money) { 

        System.out.println("Service 當(dāng)前執(zhí)行線程:" + Thread.currentThread().getName() + ", id = " + id + ", money = " + money) ; 

        Account account = accountDAO.findById(id).orElse(null) ; 

        if (account == null) { 

            return null ; 

        } 

        try { 

            TimeUnit.SECONDS.sleep(10) ; 

        } catch (InterruptedException e) { 

            e.printStackTrace(); 

        } 

        account.setMoney(account.getMoney().subtract(money)) ; 

        return accountDAO.saveAndFlush(account) ; 

Controller接口

@GetMapping("/deduction"

    public Object deductionAction(Long id, BigDecimal money) { 

        System.out.println("Controller 當(dāng)前線程:" + Thread.currentThread().getName()) ; 

        return accountService.deduction(id, money) ; 

    } 

啟動(dòng)兩個(gè)瀏覽器測(cè)試,觀察控制臺(tái)的輸出

SpringBoot一個(gè)提升N倍性能的操作

兩個(gè)瀏覽器都還在轉(zhuǎn)圈,沒(méi)有響應(yīng)。

SpringBoot一個(gè)提升N倍性能的操作

控制臺(tái)展示Controller方法都進(jìn)入了,但是Service方法只進(jìn)入了一個(gè),因?yàn)槲覀兊倪B接池只配置了一個(gè),另外一個(gè)在等待可用的連接對(duì)象。而上面我也說(shuō)了,其實(shí)Service中很長(zhǎng)的一個(gè)計(jì)算耗時(shí)是不需要事務(wù)的,即便沒(méi)有連接對(duì)象可用,我們也應(yīng)該讓這些不需要事務(wù)的操作也進(jìn)行執(zhí)行。接下來(lái)修改代碼。

編程事務(wù),提高系統(tǒng)吞吐量

@Resource 

    private TransactionTemplate transactionTemplate ; 

     

    public Account deduction(Long id, BigDecimal money) { 

        System.out.println("Service 當(dāng)前執(zhí)行線程:" + Thread.currentThread().getName() + ", id = " + id + ", money = " + money) ; 

        Account account = accountDAO.findById(id).orElse(null) ; 

        if (account == null) { 

            return null ; 

        } 

        try { 

            TimeUnit.SECONDS.sleep(10) ; 

        } catch (InterruptedException e) { 

            e.printStackTrace(); 

        } 

        // 以上業(yè)務(wù)代碼執(zhí)行可能是個(gè)很耗時(shí)的操作。 

        return transactionTemplate.execute(new TransactionCallback<Account>() { 

            @Override 

            public Account doInTransaction(TransactionStatus status) { 

                try { 

                    account.setMoney(account.getMoney().subtract(money)) ; 

                    return accountDAO.saveAndFlush(account) ; 

                } catch (Exception e) { 

                    logger.error("發(fā)生錯(cuò)誤:{}", e) ; 

                    status.setRollbackOnly() ; 

                } 

                return null ; 

            } 

        }) ; 

    } 

這里把方法上的事務(wù)注解刪了,把需要事務(wù)的操作通過(guò)編程的方式包裝,在Service中注入

TransactionTemplate對(duì)象,SpringBoot項(xiàng)目已經(jīng)自動(dòng)為我們配置好了,自動(dòng)裝配類(lèi):

TransactionAutoConfiguration.java

測(cè)試:

SpringBoot一個(gè)提升N倍性能的操作

瀏覽器都還在轉(zhuǎn)圈中,查看控制臺(tái):

SpringBoot一個(gè)提升N倍性能的操作

2個(gè)Service方法都進(jìn)去了,基本連接池只有一個(gè)連接對(duì)象,但是也不妨礙我非事務(wù)的代碼執(zhí)行,通過(guò)這樣的改造,我們的系統(tǒng)吞吐量是不是提升了N呢?

原文地址:https://www.toutiao.com/i6938209811897139724/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲国产精品久久久 | 欧美大成色www永久网站婷 | 久久久久在线 | 国产视频一区二区在线 | 久久精品成人 | 欧美成人精品在线 | 不用播放器的av | 欧美在线国产 | 亚洲第一成年人网站 | 亚洲一区二区三区免费看 | jizzxxx日本| 久久精品一区二区国产 | 成人av免费| 在线视频 亚洲 | 欧美日韩中文字幕 | 欧美高清视频在线观看 | 色女人av| 午夜私人视频 | 欧美成视频| 91精品国产综合久久久久久丝袜 | 成人黄色av | 久久国 | 久久综合一区 | 久久精品国产v日韩v亚洲 | 黄色av日韩 | 亚洲一区 日韩精品 中文字幕 | 美女久久久 | 久久机热 | 国产成人精品综合 | 人人插 | 中文av字幕 | 成人av小说| av毛片 | 亚洲一区国产视频 | 国产视频网 | 日韩中文字幕在线观看 | 免费的av网站 | 国产乱码精品一区二区三区av | 欧美一区二区三区在线观看视频 | 日韩精品一级毛片 | 国产色区 |