我已经使用 Tomcat 一段时间了。但我从未完全了解它的实际工作原理,尤其是线程池和 JDBC 连接池。
以一个标准的 Spring web 应用程序(带有 c3p0 连接池)为例。我的问题是
TC启动时,是否创建了N个线程,每个线程都有一个 应用上下文?
如果是这样,是否意味着每个线程都有自己的 自己创建的 bean 实例列表?
一个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/