繁体   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