1

我已经使用 Tomcat 有一段时间了。但是我从来没有完全了解它是如何工作的,尤其是线程池和 JDBC 连接池。

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

  1. 当 TC 启动时,它是否创建了 N 个线程,每个线程都有一个 applicationContext?

  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 个连接 x N 个线程 = 5N 个连接?

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

4

1 回答 1

4

当 TC 启动时,它是否创建了 N 个线程,每个线程都有一个 applicationContext?

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

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

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

于 2012-10-05T20:08:08.813 回答