java - 并发请求下程序耗时较长

标签 java mysql

我们的网络应用程序正处于开发模式下,我已经看到了模式的复制。即MySQl程序运行时间随着请求数量线性增加。

我们的数据库非常小(~500mb)。打开一个页面时,会并行调用 3 个过程(仅读取,不写入)。在正常运行中,我观察到一个过程的运行大约需要0.5 秒。但有趣的是,当 3 个用户打开页面时:大约需要 3 秒的时间来处理(即调用 9 个过程)。

For 5 users (i.e. 15 procedures) about 11 seconds

For 10 users (i.e. 30 procedures) about 20 seconds

对于更多的用户,甚至会增加到 40+。之后,即使我尝试从 mysql 工作台等连接数据库,它也不会连接,直到我重新启动它。程序都是只读的。

我从 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连接池?该行为的其他原因可能是什么?

最佳答案

Question: Has it got to do with configuring MySQL?

可能不是。

Or my DBCP connection pool?

可能不是。

What else can be the reason for the behaviour?

这听起来像是如果数据库服务器的性能是瓶颈就会出现的行为。这样的瓶颈可能是由于服务器受 CPU 限制或磁盘 IO 限制,或者每个查询需要长时间独占访问同一表或一组行或其他内容。

另一种可能性是该问题是由于客户端的并发瓶颈造成的。例如,如果每个请求都执行以下操作:

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

那么您就可以有效地序列化这些请求的数据库操作的执行。当同时执行 N 个请求时,这将导致运行时间线性增加。

<小时/>

但说实话,如果不详细查看 Java 代码、数据库模式和查询以及(也许)数据库配置,很难预测原因是什么。

关于java - 并发请求下程序耗时较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401156/

相关文章:

c# - 与 Microsoft Enterprise Library 共享 MySQL 连接

php - Laravel 迁移 - 创建时间戳时出现问题

mysql - laravel where子句中的子查询

java - 防止 Activity 在启动子 Activity 时被操作系统终止

java - 从 DTO 映射到实体时如何对密码进行编码?

java - java中原始整数值的同步

java - 从 HashMultiMap 获取有序数组

java - Spring Boot - application.yml,从文件中读取值

mysql - 按一列分组但不包括另一列

python mysqldb 打印文本,即使代码中没有打印语句