广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >SpringBoot提升N倍性能的操作是怎样的
  • 389
分享到

SpringBoot提升N倍性能的操作是怎样的

2024-04-02 19:04:59 389人浏览 安东尼
摘要

SpringBoot提升N倍性能的操作是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:springboot2.3.9.RELEAS

SpringBoot提升N倍性能的操作是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

环境:springboot2.3.9.RELEASE + JPA + Mysql

一般我们在spring项目中都是在方法或者是类上添加事务支持,如下使用方式:

@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) ; }

以上应该是我们在项目中使用事务的姿势了。这里是方法级别的事务,当方法执行的时候通过动态代理打开事务,执行代码,提交事务/回滚事务,执行的逻辑大体如下:

transaction.begin(); method.invoke(xxxx); transaction.commit(); / transaction.rollback();

在上面举的示例比较简单,整个操作就是计算扣减金额,然后更新数据。这个业务也就是在保存数据的时候需要使用到事务,其它的一些计算是不需要在一个事务中的。想象下如果我们这里保存操作之上的代码,计算逻辑是个非常复杂的逻辑可能需要消耗好几秒甚至是十几秒而实际保存操作可能就几毫秒就完成了。我们又知道这方法级的事务在执行的时候是要先获取一个Connection对象(数据库连接对象的)然后打开事务(设置自动提交为false,connection.setAutoCommit(false));说到这你应该能想到,从获取一个Connection对象到释放需要几秒甚至是十几秒的时间,而占用的这些时间中大部分的时间都是与事务无关的操作也就是说是不需要事务的,而我们的数据库连接对象本身就是很宝贵及有限的,这就造成了我们系统的资源浪费,系统的吞吐量非常的低。接下来我们就来通过编程的方式控制事务提供系统的吞吐量。

模拟常规的事务,展现低吞吐量操作

数据库连接配置:

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

这里把数据库连接池配置为1个。

Service中模拟耗时的操作

@Transactional public Account deduction(Long id, BigDecimal money) {         System.out.println("Service 当前执行线程:" + 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 当前线程:" + Thread.currentThread().getName()) ;         return accountService.deduction(id, money) ;     }

启动两个浏览器测试,观察控制台的输出

SpringBoot提升N倍性能的操作是怎样的

两个浏览器都还在转圈,没有响应。

SpringBoot提升N倍性能的操作是怎样的

控制台展示Controller方法都进入了,但是Service方法只进入了一个,因为我们的连接池只配置了一个,另外一个在等待可用的连接对象。而上面我也说了,其实Service中很长的一个计算耗时是不需要事务的,即便没有连接对象可用,我们也应该让这些不需要事务的操作也进行执行。接下来修改代码。

编程事务,提高系统吞吐量

@Resource     private TransactionTemplate transactionTemplate ;          public Account deduction(Long id, BigDecimal money) {         System.out.println("Service 当前执行线程:" + 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();         }         // 以上业务代码执行可能是个很耗时的操作。         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("发生错误:{}", e) ;                     status.setRollbackOnly() ;                 }                 return null ;             }         }) ;     }

这里把方法上的事务注解删了,把需要事务的操作通过编程的方式包装,在Service中注入

TransactionTemplate对象,SpringBoot项目已经自动为我们配置好了,自动装配类:

TransactionAutoConfiguration.java

测试:

SpringBoot提升N倍性能的操作是怎样的

浏览器都还在转圈中,查看控制台:

SpringBoot提升N倍性能的操作是怎样的

2个Service方法都进去了,基本连接池只有一个连接对象,但是也不妨碍我非事务的代码执行,通过这样的改造,我们的系统吞吐量是不是提升了N呢?

看完上述内容,你们掌握SpringBoot提升N倍性能的操作是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网VUE频道,感谢各位的阅读!

--结束END--

本文标题: SpringBoot提升N倍性能的操作是怎样的

本文链接: https://www.lsjlt.com/news/82071.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot提升N倍性能的操作是怎样的
    SpringBoot提升N倍性能的操作是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:springboot2.3.9.RELEAS...
    99+
    2022-10-19
  • 怎么让你的Nginx提升10倍性能
    本篇内容主要讲解“怎么让你的Nginx提升10倍性能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么让你的Nginx提升10倍性能”吧! 1   建议一:使用反向...
    99+
    2023-06-16
  • 百万级高并发mongodb集群性能数十倍提升优化实践是怎样的
    百万级高并发mongodb集群性能数十倍提升优化实践是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、背景 线上某集群...
    99+
    2022-10-18
  • 提升电脑性能和优化电脑系统的操作方法
    这期内容当中小编将会给大家带来有关提升电脑性能和优化电脑系统的操作方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是系统优化  答:系统优化模块,将“清理垃圾”、“清除痕迹”、“清理插件”、“开机加...
    99+
    2023-06-14
  • Linux操作系统下怎么提高PHP的性能
    本篇内容主要讲解“Linux操作系统下怎么提高PHP的性能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux操作系统下怎么提高PHP的性能”吧!apc 安装下了最新的APC-3.0.18....
    99+
    2023-06-10
  • DB2数据库怎么提高备份操作的性能
    小编给大家分享一下DB2数据库怎么提高备份操作的性能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  提高数据库配置参数UTIL...
    99+
    2022-10-18
  • C#提高StringBuilder操作性能优化的方法是什么
    本篇内容介绍了“C#提高StringBuilder操作性能优化的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在 .NET 中,S...
    99+
    2023-06-25
  • Discuz! X3怎样进行内存优化提升程序性能和服务器的负载能力
      内存优化   目前支持的内存优化接口有 Memcache、eAccelerator、Alternative php Cache(APC)、Xcache、Redis 五种,优化系统将会依据当前服务器环境依次选用接口。 ...
    99+
    2022-06-12
    Discuz! 内存优化
  • Go语言中的缓存机制是怎样的,如何提高性能?
    Go语言是一门快速发展的编程语言,它在性能和易用性方面都有着很好的表现。其中,缓存机制是Go语言中一个非常重要的话题。在本篇文章中,我们将深入探讨Go语言中的缓存机制,以及如何提高其性能。 一、缓存机制 缓存机制是一种用于加速数据访问的技术...
    99+
    2023-06-29
    缓存 javascript 面试
  • 在RHEL/CentOS系统上使用YUM history命令回滚升级操作是怎样的
    在RHEL/CentOS系统上使用YUM history命令回滚升级操作是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。为服务器打补丁是 Linux 系统管理员的一项...
    99+
    2023-06-16
  • Ajax提交表单数据到入库的全盘操作过程是怎样的
    Ajax提交表单数据到入库的全盘操作过程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 *******p...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作