【问题标题】:How to find JDBC connection pool threads created in SpringBoot application?如何找到在 Spring Boot 应用程序中创建的 JDBC 连接池线程?
【发布时间】:2016-09-21 06:40:41
【问题描述】:

在我的 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。在使用 Spring Data 存储库触发 1000 个与 MySQL 对话的 REST 调用后,我看到线程数增加到 50 以上。但是,一旦 REST 调用结束并过一会儿,线程数就会下降到 ~30。我看到大约 10 个工作线程保持空闲状态。

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

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

【问题讨论】:

    标签: tomcat jdbc spring-boot connection-pooling visualvm


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我只看到了 Tomcat JDBC Pool Cleaner 线程,所以对创建线程或单个线程持怀疑态度。
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2017-06-22
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多