2012-10-05 104 views
1

我一直在使用Tomcat。但是我從來沒有讓自己完全瞭解它是如何工作的,特別是線程池和JDBC連接池。需要幫助理解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> 

這將創建5個JDBC連接創建這個bean時。這是否意味着我們會以

5個連接x N個線程= 5個連接?

這聽起來不對我。我認爲JDBC池是在所有線程中共享的。但顯然,JDBC池(定義爲ComboPooledDataSource bean)是作爲applicationContext的一部分創建的,對嗎?

回答

4

當TC啓動時,它創建N個線程,每一個ApplicationContext?

不,它只創建一個上下文,併爲該Web應用程序中的每個線程提供所有可用的bean。這意味着Spring bean(默認爲singleton)需要是線程安全的,因爲它們通常由多個線程同時訪問。這很好,因爲通常Spring bean是無狀態的,因此定義是線程安全的。

此外,只有一個JDBC連接池持有5個連接。所有的Tomcat web線程(以及其他的,如果創建的話)都爭奪這5個連接。

因此,您剩餘的問題不再相關。是什麼讓你認爲Spring爲每個線程創建了上下文?

+0

太好了。你已經回答了我的問題。我認爲TC(不是Spring本身)創建了N個上下文,每個上下文都有一組Spring bean(c3p0連接池就是其中之一)。現在一切都很有意義:在所有線程中共享一個上下文。 – scabbage