Java 与spring boot应用程序一起使用下拖时出现问题

Java 与spring boot应用程序一起使用下拖时出现问题,java,mysql,tomcat,spring-boot,undertow,Java,Mysql,Tomcat,Spring Boot,Undertow,我有一个SpringBoot应用程序,它运行默认的嵌入式tomcat(带有TomcatJDBC连接池)。这是生产和运行良好。我使用mysql作为我的数据库 我现在正在我的测试环境中做一些压力测试,并试图看看如果我从嵌入式Tomcat切换到嵌入式Undertow,是否能获得任何明显的好处。人们声称通过这样做可以显著提高吞吐量,这是由于底层请求处理的异步性 我知道如何排除tomcat并将undertow添加到启动应用程序。完成后,我试着运行我的压力测试脚本,大约每秒生成500个请求,在这个负载下运行

我有一个SpringBoot应用程序,它运行默认的嵌入式tomcat(带有TomcatJDBC连接池)。这是生产和运行良好。我使用mysql作为我的数据库

我现在正在我的测试环境中做一些压力测试,并试图看看如果我从嵌入式Tomcat切换到嵌入式Undertow,是否能获得任何明显的好处。人们声称通过这样做可以显著提高吞吐量,这是由于底层请求处理的异步性

我知道如何排除tomcat并将undertow添加到启动应用程序。完成后,我试着运行我的压力测试脚本,大约每秒生成500个请求,在这个负载下运行5分钟,看看它是如何工作的。当我这样做时,在最初的几秒钟之后,我开始间歇性地获得下面给出的jdbc异常

 org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 
     at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431) ~[spring-orm-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:426) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:275) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
     at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) ~[spring-data-jpa-1.10.2.RELEASE.jar!/:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
这意味着无法获取jdbc连接

注意:如果我删除嵌入式undertow并再次将嵌入式tomcat添加到我的应用程序中,那么相同的测试运行良好,没有任何与jdbc连接相关的异常

我的底层Tomcat jdbc池有100 db连接。对于undertow,我尝试了100个工作线程和100个io线程

我还尝试使用HikariCP代替默认的tomcat jdbc池。我尝试使用maximumPoolSize=100和connectionTimeOut=60000的HikariCP。同样,嵌入式Tomcat+HikariCP在该压力测试下运行良好。但嵌入式Undertow+HikariCP给出了类似的例外情况

因此,当我在图片中引入“暗流”时,会发生一些不同的事情。但我不能理解它。请注意,这些异常是间歇性出现的,但在每次进行压力测试时,当使用Undertow时,肯定会出现

我通常会寻找这样的问题。总的来说,我找不到像这样普通的床


任何分析情况的帮助都会节省大量时间。

首先,你们最好一次改变一件事,以减少潜在的问题

Undertow-100 IO线程太多了。您可能应该坚持这里的默认设置,即我认为每个核心1个IO线程。IO线程唯一的任务是管理打开的连接并处理任何非阻塞工作。JDBCSQL查询正在阻塞,因此需要确保阻塞的任何端点都会将请求分派给工作线程。你可以使用BlockingHandler,我不知道如何使用Spring。同样,100个辅助线程可能有点过多,默认值要低很多,我相信20-30范围。在切换到HikariCP之前,请确保此操作与现有连接池正常工作。我建议将线程池保留为默认值以启动,并确保您正在调度工作线程

HikariCP-100连接对于HikariCP来说也很重要,除非您有大量非常长时间运行的查询。更多信息


不要试图同时改变两者。追踪这种情况下发生的事情将更加困难。

首先,你们最好一次改变一件事,以减少潜在的问题

Undertow-100 IO线程太多了。您可能应该坚持这里的默认设置,即我认为每个核心1个IO线程。IO线程唯一的任务是管理打开的连接并处理任何非阻塞工作。JDBCSQL查询正在阻塞,因此需要确保阻塞的任何端点都会将请求分派给工作线程。你可以使用BlockingHandler,我不知道如何使用Spring。同样,100个辅助线程可能有点过多,默认值要低很多,我相信20-30范围。在切换到HikariCP之前,请确保此操作与现有连接池正常工作。我建议将线程池保留为默认值以启动,并确保您正在调度工作线程

HikariCP-100连接对于HikariCP来说也很重要,除非您有大量非常长时间运行的查询。更多信息


不要试图同时改变两者。在这种情况下,追踪发生了什么将更加困难。

嘿,你找到解决方案了吗?我在使用JUnit5运行Spring启动测试(使用嵌入式底层)时遇到了完全相同的问题。。。虽然它在本地运行良好,但在AWS Codebuild机器上运行时失败。嘿,您找到解决方案了吗?我在使用JUnit5运行Spring启动测试(使用嵌入式底层)时遇到了完全相同的问题。。。虽然它在本地运行良好,但在AWS代码构建机器上运行时失败