2013-07-01 59 views
0

我們的網絡應用程序處於開發模式下,並且我看到了一個模式複製。即MySQl過程運行時間隨着請求數量線性增加。程序在併發請求下需要很長時間

我們的db非常小(〜500mb)。在打開頁面時,並行調用3個過程(只讀,不寫)。在正常運行中,我發現運行過程大約需要0.5 sec。但有趣的是,當3個用戶打開頁面時:大約需要3秒的時間來處理(即調用9個過程)。

對於5個用戶(即,15程序)11秒左右

對於10個用戶(即 30程序)約20秒

爲更多的用戶,它甚至增加至40+ 。之後,即使我嘗試連接我的數據庫從MySQL工作臺左右,它不會連接,直到我重新啓動它。程序都是隻讀的。我的電話是Spring JDBC。我的​​3210:

//DBCP connection pool settings. 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" p:initialSize="20" p:maxActive="-1" p:minIdle="5" 
    p:maxIdle="35" p:driverClassName="com.mysql.jdbc.Driver" 
    p:url="jdbc:mysql://10.0.1.100/warehouse?useUnicode=true&amp;" 
    p:username="user" p:password="123" p:testOnBorrow="true" 
    p:validationQuery="SELECT 1" /> 
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
</bean> 

問題:它與配置MySQL有關嗎?或者我的DBCP連接池?還有什麼可以成爲行爲的原因?

+0

這可能歸結爲MySQL。嘗試對它進行序列化訪問,通過在數據庫訪問代碼周圍實施一個「syncronized」塊,並查看它是否有所作爲。 –

+0

它確實會(已經嘗試過)。但那又是一個瓶頸。 – Jatin

+0

也許你正在重複使用單個連接到數據庫?這似乎是響應時間與請求數量的增長完全相同。所以吞吐量保持不變。 DB應該更平行。 – darijan

回答

1

問題:它是否與配置MySQL有關?

可能不是。

或者我的DBCP連接池?

可能不是。

該行爲的原因是什麼?

這聽起來像是如果數據庫服務器的性能是瓶頸,那種行爲將會得到。這樣的瓶頸可能是由於服務器受到CPU限制或磁盤IO限制,或者每個查詢需要長時間獨佔訪問同一個表或一組行或其他內容。

另一種可能性是該問題是由於客戶端的併發瓶頸造成的。例如,如果每個請求都做了這樣的事情:

synchronized (someGlobalLock) { 
    // perform queries, updates 
    } 

然後你有效地序列化這些請求的數據庫操作的執行。當N個請求同時執行時,這將導致經過時間的線性增加。


但說實話,這是很難預測的原因是什麼,而不在Java代碼,數據庫模式和查詢以及(也許)數據庫配置看詳細。

+0

按照同步的東西,我已經很好地描述了可以說db是問題並且沒有外部同步。我提到的問題是執行查詢所需的時間,而不是完整的請求。 – Jatin

+0

雖然是,所有的程序都使用同一張表。 – Jatin

+1

@Jatin - 我不認爲簡單的剖析會告訴你是否存在併發瓶頸。無論如何,我已經給了你一些想法......這可能與任何Answer都能做到的一樣多。 –

相關問題