gpt4 book ai didi

spring - 需要帮助理解 Tomcat 线程池和 JDBC 连接池

转载 作者:行者123 更新时间:2023-11-28 22:06:46 26 4
gpt4 key购买 nike

我已经使用 Tomcat 一段时间了。但我从未完全了解它的实际工作原理,尤其是线程池和 JDBC 连接池。

以一个标准的 Spring web 应用程序(带有 c3p0 连接池)为例。我的问题是

  1. TC启动时,是否创建了N个线程,每个线程都有一个应用上下文?

  2. 如果是这样,是否意味着每个线程都有自己的自己创建的 bean 实例列表?

  3. 一个bean定义是

<bean id="dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${db.driverClassName}"/>
<property name="jdbcUrl" value="${db.url}"/>
<property name="user" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="minPoolSize" value="5" />
</bean>

这将在创建此 bean 时创建 5 个 JDBC 连接。这是否意味着我们将结束

5 connections x N threads = 5N connections?

这听起来不对。我认为 JDBC 池在所有线程之间共享。但显然 JDBC 池(定义为 ComboPooledDataSource bean)是作为 applicationContext 的一部分创建的,对吧?

最佳答案

When TC starts up, does it create N threads, each with an applicationContext?

不,它只创建一个上下文,其中包含可用于该 Web 应用程序中的每个线程的所有 bean。这意味着 Spring bean(默认为单例)需要线程安全,因为它们通常由多个线程并发访问。这很好,因为通常 Spring bean 是无状态的,因此根据定义是线程安全的。

此外,只有一个 JDBC 连接池持有 5 个连接。所有 Tomcat Web 线程(以及其他线程,如果已创建)竞争这 5 个连接。

因此,您剩下的问题不再相关。是什么让您认为 Spring 会为每个线程创建上下文?

关于spring - 需要帮助理解 Tomcat 线程池和 JDBC 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com