当前位置: 首页 > 知识库问答 >
问题:

Spring Boot应用程序性能较慢

翟俊哲
2023-03-14

我有一个非常基本的Spring Boot应用程序,它公开了一个非常简单的实体的CRUD Rest API。使用JMeter运行性能测试显示响应时间很差

产品(id、名称、描述)

约束:id PK自动增量

设置:

  • 线程数:100

4个API,用于执行以下功能

@Override
public Product findById(Integer id) {
    return repository.findById(id)
            .map(mapper::map)
            .orElseThrow(() -> new RecordNotFoundException(1, "Product not found"));
}

@Transactional
@Override
public Product create(Product Product) {
    ProductEntity entity = mapper.map(Product);
    
    repository.save(entity);

    return mapper.map(entity);
}

@Transactional
@Override
public Product update(Integer id, Product Product) {
    ProductEntity entity = repository.findById(id).orElseThrow();

    mapper.mapTo(entity, Product);

    repository.save(entity);

    return mapper.map(entity);
}

@Transactional
@Override
public void delete(Integer id) {    
    repository.deleteById(id);
}

我试图用可视化虚拟机查看原因。似乎存储库函数花费了太多时间。我假设是数据库导致了这个问题。

连接池设置:因为我没有设置任何内容,假设我的应用程序使用HikariCP,默认大小为100。

数据库:对于以上结果,使用MySQL(Innodb引擎)尝试并禁用了自动提交。

Spring启动版本:2.4。0

系统:16GB RAM,核心i7

问题:

我说的对吗?这里的瓶颈是连接池或数据库,池大小的最佳值是什么以减少响应时间?

为什么所有的API在图中都遵循相同的趋势-一起上升或下降?

更新:

  1. 根据建议,它们都托管在一台单独的机器上(基于云计算)
  2. 略加分析-存储库需要时间(com.sun.proxy.$.methodName)

共有2个答案

曹钊
2023-03-14

您可以执行以下操作来查找问题:

1-使用Gatling进行性能测试,它使用的资源较少,不会影响测试结果。

2-使用APM代理来监控到底什么是需要长时间的过程,是数据库查询,还是不(APM)

3-使用undertow代替tomcat或其他web应用程序

松骏俊
2023-03-14

我可以想到以下可能的原因:

  1. 您的Spring引导应用程序运行的机器缺乏资源(CPU,RAM等)-请确保使用即监视它们。JMeter的插件
  2. 使用像YourKit或JProfiler这样的分析器工具来查看应用程序花费最多时间的地方
  3. 如果您认为问题出在数据库中:
  • 确保数据库引擎已正确设置,即遵循优化提示和技巧
  • 也可能是查询效率不高,因此检查查询执行计划,只添加相关索引可能会大大加快速度
 类似资料:
  • 我在src/main/resources下创建了2个文件: 应用程序。属性 第一个具有从env变量中获取值的属性,而后者具有固定值。 根据这里的具体情况,我以这样的方式推出了Spring靴: 然而,不会产生任何影响,并且应用程序是局部的。属性似乎被忽略。 有什么提示吗?

  • 我正在将一个非常基本的web应用程序部署到Google应用程序引擎。我使用的是Springboot,我可以在本地很好地运行应用程序,但当我部署到Google时,应用程序引擎不会启动实例。我在启动时配置了一个云SQL数据源。 我有云sql配置属性配置src/main/Resources/application.properties.App Engine似乎找不到这些属性,所以它无法正确设置Cloud

  • 我有一个SpringBoot项目(maven/java8)。 我想通过Maven配置文件(dev.properties|prod.properties)过滤src/main/Resources/application.properties中的一些自定义变量 Maven命令: 应用属性: 开发属性: prod.properties: pom.xml:

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 完成干净的构建后,我将war文件复制到Tomcat的文件夹中。但是部署会发生两次,并且在上下文已经存在的情况下以异常结束。我错过了什么? 非常感谢您的帮助。

  • 问题内容: 为了在Linux上开发高度网络密集型服务器应用程序,首选哪种架构?这个想法是,该应用通常可以在具有多个内核(虚拟或物理)的机器上运行。考虑到性能是关键标准,选择多线程应用程序还是采用多进程设计更好?我确实知道资源共享和从多个进程访问此类资源的同步是很多编程开销,但是如前所述,整体性能是关键要求,因此我们可以忽略这些事情。编程语言为C / C ++。 我听说,即使是多线程应用程序(单个进