我一直在使用Tomcat。但我从来没有完全了解它实际上是如何工作的,特别是线程池和JDBC连接池。
以标准的Spring Web应用程序(带有c3p0连接池)为例。我的问题是
当TC启动时,它会创建N个线程,每个线程都有一个 的applicationContext?
如果是这样,是否意味着每个线程都会拥有它 自己创建的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个连接x个N个线程= 5个连接?
这对我来说听起来不对。我认为JDBC池是在所有线程之间共享的。但显然JDBC池(定义为ComboPooledDataSource bean)是作为applicationContext的一部分创建的,对吧?
答案 0 :(得分:4)
当TC启动时,是否会创建N个线程,每个线程都有一个applicationContext?
不,它只创建一个上下文,其中所有bean都可用于该Web应用程序中的每个线程。这意味着Spring bean(默认情况下为singleton)需要是线程安全的,因为它们通常由多个线程同时访问。这很好,因为通常Spring bean是无状态的,因此根据定义是线程安全的。
此外,只有一个JDBC连接池可以容纳5个连接。所有Tomcat Web线程(以及其他人,如果已创建)都会竞争这5个连接。
因此,您剩下的问题已不再适用。是什么让你认为Spring为每个线程创建了上下文?