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

标签 spring tomcat jdbc connection-pooling c3p0

我已经使用 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/

相关文章:

java - 我们可以有多个数据源到单个数据库吗

java - Ionic with Tomcat - 成功登录,但没有注入(inject)主体

java - 没有接口(interface)使用spring DI是否正确

spring - Gradle | Spring boot 依赖不排除

eclipse - 无法从主机 Windows 7 上的 Eclipse 远程调试在 CentOS 虚拟机上运行的 Tomcat

tomcat - 多个 Tomcat 实例在 EC2 实例上有意义吗?

java - 如何在tomcat web应用程序中动态添加html/jsp页面(开发环境)

java - 如何在 Spring jdbc 中从远程服务器获取 mysql 连接?

java - 连接 Kundera 到 Cassandra 集群

spring - 在 Scala 中使用 Spring @Transactional