tomcat - 如何查找在 Spring Boot 应用程序中创建的 JDBC 连接池线程?

标签 tomcat jdbc spring-boot connection-pooling visualvm

我在我的 Spring Boot 1.4 应用程序中使用 JDBC 与本地 MySQL 通信时具有以下属性 -

  • spring.datasource.test-while-idle=true
  • spring.datasource.test-on-borrow=true
  • spring.datasource.validation-query=SELECT 1
  • spring.datasource.initial-size=50
  • spring.datasource.max-active=100
  • spring.datasource.max-idle=50
  • spring.datasource.min-idle=50
  • spring.datasource.initial-size=50
  • spring.datasource.tomcat.max-active=100
  • spring.datasource.tomcat.max-idle=50
  • spring.datasource.tomcat.min-idle=50
  • spring.datasource.tomcat.initial-size=50

我知道最后四行是重复的,但我保留了它们以尝试是否有任何组合有效。 Spring Boot 文档说所有数据源 tomcat 属性都应在 spring.datasource.tomcat.* 下。另一方面,前三行适用于 SpringBoot 1.3 和 1.4。因此,期望连接池参数也能正常工作。

启动应用程序后,我在 VisualVM 中检查了它的所有线程。计数约为 20,远小于我设置的 50。在触发 1000 个使用 Spring Data 存储库与 MySQL 通信的 REST 调用后,我看到线程数增加到超过 50。但是,一旦 REST 调用结束并在一段时间后,线程数下降到 ~30。我看到大约 10 个工作线程保持空闲。

那么,我的问题是,您将如何检测 Spring Boot 应用程序线程池中的 JDBC 连接池线程?

另外,属性配置有什么问题?为什么未创建预期线程数的 JDBC 连接池?

最佳答案

连接池不会创建线程(或者:它可能会创建 1 或 2 个线程,但仅此而已)。连接池创建(并跟踪)到数据库的 JDBC 连接,以便在您的应用程序请求时分发。池本身不需要每个连接都有一个线程。

您看到的大多数线程要么来自 Java 本身(例如垃圾收集等)加上处理 HTTP 连接所需的线程(可能会在负载下增加,在空闲时减少),以及您的应用程序代码启动的任何其他线程.

关于tomcat - 如何查找在 Spring Boot 应用程序中创建的 JDBC 连接池线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609142/

相关文章:

java - tomcat日志请求参数

apache - 使用 SPNEGO/Kerberos 和委派的 Tomcat 身份验证

java - 实现 JWT 身份验证服务

java - 英镑符号(£ 或 ₤)等字符的 URI 编码问题

tomcat - 从 Tomcat 5.0 的命令行获取 catalina.base 属性

java - 使用有效查询字符串的PreparedStatement MySQLSyntaxErrorException

java - JDBC 身份验证中的PreparedStatmentCallBack 错误

java - PreparedStatement 中的 IN 子句

java - 当自定义事务管理器连接失败时,Spring Boot应用程序不会快速失败

java - Spring Boot 和嵌入式 activemq 主机配置