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

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

章鸿光
2023-03-14

我有一个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-pool有100 db连接。对于undertow,我尝试了100个工作线程和100个iOS线程。

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

所以当我在照片中引入暗流时,会有不同的事情发生。但是我不能理解它。请注意,这些异常是间歇性的,但是在我的压力测试的每一次运行中,当使用Undertow时,这些异常都是肯定的。

我一般搜索这样的问题。总的来说,我找不到这样普通的婴儿床。

任何有助于分析情况的帮助都会节省很多时间。

共有1个答案

孔建柏
2023-03-14

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

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

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

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

 类似资料:
  • 所以我使用IntelliJ,并使用JavaFX构建了我的应用程序。但当我开始我的主要工作时: 我得到以下错误,我不知道这些错误来自哪里。。。在我切换github上的分支并重新设置所有配置之前,一切都很正常。。。 我得到的错误:

  • 我正在学习SeleniumWebDriver,在成功使用firefox之后,现在我想尝试启动Chrome。所以我设置了它的驱动程序 但是当代码流到达驱动程序时。get()指令我收到此异常: 并显示此页面: “只允许本地连接”是什么意思?如何修复?

  • 当我试图使用命令运行create-react-app时,我收到以下消息 然后,我尝试使用全局卸载create-react-app,并再次运行npx命令。我仍然收到相同的消息,即我应该全局卸载create-react-app,即使如此,全局安装的唯一模块是我机器上的npm

  • 几天以来,我在运行Struts网络应用程序时遇到了一些问题。我尝试了StackOverflow中与我的问题相关的几个解决方案,但都不起作用。 网状物xml: struts。xml: 登录。jsp: 登录。爪哇: 我补充说: commons-logging-1.1.3。罐子 freemarker-2.3.19。罐子 ognl-3.0.6。罐子 struts2-core-2.3.15.1。罐子 xwo

  • 我正在尝试让一个简单的HTTP控制台应用程序作为Azure服务应用程序运行。它所做的只是在连接时返回OK。它在我的笔记本电脑上运行良好,我可以使用VS2019发布到Azure ok。问题是用于监听的前缀。 在我的笔记本电脑上,我可以使用超文本传输协议://: 80/; https://: 443/,但在Azure中,我得到一个错误:[例外]访问被拒绝。 本文https://github.com/p