我们的网络应用程序正处于开发模式下,我已经看到了模式的复制。即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&"
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/