簡體   English   中英

在並發請求下,過程花費很長時間

[英]Procedure takes long time under concurrent requests

我們的Web應用程序處於開發模式,我已經看到了模式復制。 即MySQl過程的運行時間隨請求數量線性增加。

我們的數據庫很小(〜500mb)。 打開頁面時,並行調用3個過程(僅讀取,不寫入)。 在正常運行中,我觀察到運行過程大約需要0.5 sec 但是有趣的是,當3個用戶打開頁面時:處理大約需要3秒鍾(即調用9個過程)。

對於5個用戶(即15個過程),大約11秒

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

對於更多用戶,它甚至增加到40+。 之后,即使我嘗試從mysql workbench左右連接我的數據庫,它也不會連接,直到我重新啟動它為止。 過程均為只讀。

我從Spring JDBC調用它。 我的config.xml

//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連接池? 還有什么可能是該行為的原因?

問題:與配置MySQL有關嗎?

可能不是。

還是我的DBCP連接池?

可能不是。

行為的原因還有哪些?

這聽起來像是如果數據庫服務器的性能成為瓶頸,那行為就會出現。 這樣的瓶頸可能是由於服務器綁定了CPU或磁盤IO綁定了,或者是每個查詢都需要長時間對同一表或行集或某些東西進行獨占訪問。

另一種可能性是該問題是由於客戶端的並發瓶頸所致。 例如,如果每個請求都執行以下操作:

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

那么您就可以有效地序列化這些請求的數據庫操作的執行。 當同時執行N個請求時,這將導致經過時間線性增加。


但老實說,如果不詳細研究Java代碼,數據庫模式和查詢以及(也許)數據庫配置,很難預測原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM