2013-02-06 17 views
1

我們有一個使用C3P0來集中連接的Web應用程序。我們將C3P0作爲數據源注入到JdbcTemplate中。你可以看到我們是如何做到這一點的位置:此連接池情況將如何泛出?

<bean id="dataSourceDev" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="${databasedev.driver}" /> 
    <property name="jdbcUrl" value="${databasedev.url}"/> 
    <property name="user" value="${databasedev.username}"/> 
    <property name="password" value="${databasedev.password}"/> 

    <property name="initialPoolSize" value="5" /> 
    <property name="minPoolSize" value="5" /> 
    <property name="maxPoolSize" value="1000" /> 
    <property name="acquireIncrement" value="5" /> 
    <property name="maxStatements" value="1000" /> 
    <property name="maxStatementsPerConnection" value="1000"/> 
    <property name="maxIdleTime" value="10800"/> <!-- 3 hours --> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <constructor-arg> 
     <ref bean="dataSourceDev" /> 
    </constructor-arg> 
</bean> 

<bean id="someDaoBean" class="com.gedi.platform.dao.SomeDaoClass"> 
    <property name="jdbcTemplate" ref="jdbcTemplate" /> 
</bean> 

<bean id="someResourceClass" class="com.gedi.platform.SomeResourceClass"> 
    <property name="someDao" ref="someDaoBean" /> 
</bean> 

你可以看到,這是一個J2EE Web應用程序 - 它使用碼頭作爲其應用服務器。我的問題是,Jetty如何實例化我們的bean,以及如何影響連接池?如果我們有幾十個用戶在不同的時間使用這個網站,那麼所有這些用戶都會被放置在同一個連接池中嗎?或者每個客戶端只有一個連接池,其中每個HTTP客戶端都會創建Resource,DAO,JdbcTemplate和C3P0的新實例?

我清楚了嗎?我想要的是一個用於所有HTTP請求的連接池,無論它們是來自源自波士頓還是新西蘭的網頁瀏覽器。這樣,連接池正在發揮其最大效果。但是,如果爲每個HTTP客戶端實例化一個新的連接池,那麼池並不會有太大的改進。

編輯

一個重要的珍聞 - 我們使用JAX-RS的澤西參考實現產生RESTful接口。所以我們的servlet通過Jersey發送請求,找到合適的Resource類/方法來處理它們。我想知道Jersey是否會在每個請求中重新實例化這些類,或者始終保持它們的一個實例。

回答

1

Jersey和Jetty在這裏都沒有關係。春天在這裏很重要。而在春天,每一個bean(比如你的dataSourceDev,jdbcTemplatesomeDaoBean)都是單身人士。這意味着當Spring應用程序上下文啓動時,它將創建它們中的每一個的一個實例。

這意味着無論您使用什麼DataSource(Web請求,後臺作業等),都會使用相同的實例(因此使用相同的連接池)。你是對的,如果連接池是根據每個請求創建的,那麼它不會有太大的改進。其實它會慢很多。所有需要數據庫訪問的代碼將競爭並重用相同的連接(或者如果沒有可用的話,請等待)。但是,在您的情況下(這是99%的Web應用程序的工作原理)。順便說一句,確保你的數據庫可以處理1000個併發連接。

+0

感謝您的明確答案! – ktm5124

+0

和萬歲馬格納斯卡爾森。 – ktm5124

1

Spring創建beans並對它們進行緩存,因此除非您已將bean指定爲prototype作用域(它爲每個請求創建一個新的bean),所有bean默認情況下都是單例。碼頭不會干涉。

當請求進入時,DispatcherServlet捕獲該請求並將其傳遞給相應的處理程序。如果處理程序沒有被聲明爲prototype bean,則處理程序是相同的bean。

您正確理解連接池。這正是爲什麼創造這個概念的原因。請求來自哪裏並不重要,在任何時間點連接到數據庫的最大連接數將是您在maxPoolSize屬性中定義的連接數。