在并发请求下,过程需要很长时间

时间:2013-07-01 09:27:08

标签: java mysql

我们的网络应用程序处于开发模式,我看到了一个模式复制。即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连接池?还有什么可能是这种行为的原因?

1 个答案:

答案 0 :(得分:1)

  

问题:是否与配置MySQL有关?

可能不是。

  

或者我的DBCP连接池?

可能不是。

  

还有什么可能是这种行为的原因?

这听起来就像数据库服务器的性能是瓶颈所会产生的那种行为。这样的瓶颈可能是由于服务器受CPU限制或光盘IO限制,或者每个查询都需要对同一个表或一组行或其他东西进行长时间的独占访问。

另一种可能性是问题是由于客户端的并发瓶颈。例如,如果每个请求都这样做:

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

然后,您正在有效地序列化这些请求的数据库操作的执行。当同时执行N个请求时,这将导致经过时间的线性增加。


但说实话,如果不仔细查看Java代码,数据库架构和查询以及(可能)数据库配置,很难预测原因是什么。