gpt4 book ai didi

java - 操作超时和连接重置 - 400 并发访问 MySQL

转载 作者:行者123 更新时间:2023-11-28 23:42:17 25 4
gpt4 key购买 nike

一些背景

我正在做一个项目,我们有一个 1999 年用 Java EE 1.4 编写的过时的非常简单的书店 Web 应用程序。但是,目的是对其进行现代化改造,以便在亚马逊 AWS 等云环境中运行。我们决定从一开始就使用 Spring 框架、Hibernate 和 c3p0 进行连接池重写。

除了 web 应用程序,我们还有一个名为 RBE(远程浏览器模拟器)的 web 应用程序压力工具。您只需告诉 RBE 您想要多少用户,他就会为每个用户创建一个线程。每个线程都随机生成 url,只要用户浏览页面(我们定义用户浏览网站 180 秒),它就会这样做。在那之后,它关闭了一个线程,就是这样。对于每个请求,它都需要 HTML 页面源,解析出 jsessionid,然后继续下一个 url。

问题

当我为 400 个用户(即每秒 400 个请求)运行 RBE 时,我很快得到以下异常:

java.net.SocketException: Connection reset by peer
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:382)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:241)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:228)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:431)
at java.net.Socket.connect(Socket.java:527)
at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:388)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:523)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:227)
at sun.net.www.http.HttpClient.New(HttpClient.java:300)
at sun.net.www.http.HttpClient.New(HttpClient.java:317)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
at rbe.EB.getHTML(EB.java:423)
at rbe.EB.run(EB.java:324)

一段时间后,当 RBE 尝试浏览其他子页面时,我得到:

java.net.ConnectException: Operation timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:382)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:241)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:228)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:431)
at java.net.Socket.connect(Socket.java:527)
at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:388)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:523)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:227)
at sun.net.www.http.HttpClient.New(HttpClient.java:300)
at sun.net.www.http.HttpClient.New(HttpClient.java:317)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
at rbe.EB.getHTML(EB.java:423)
at rbe.EB.run(EB.java:324)

EB.java:423)(异常发生处)的代码是:

BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream() ) );

我的my.cnf配置:

[mysqld]
log=/var/log/mysqld.log
max_connections = 200
log-slow-queries = /var/log/mysqld_slow_queries.log
log-error = /usr/local/mysql/data/mysql-error.log
back-log = 200
key_buffer_size=16M
max_allowed_packet=100M
interactive_timeout=30
wait_timeout=30

server.xml中Tomcat相关设置:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" acceptCount="500" />

我还做了一个测试,延迟 2 秒提供静态 html 文件,并且没有对数据库进行任何迭代。我做这个测试是为了看看Tomcat是否不能处理400个并发请求。 Tomcat 成功通过了这个测试。

400并发访问mysql的瓶颈是什么?这对 MySQL 来说太多了吗?

最佳答案

您的 my.cnf 声明 max_connections = 200。这可能是个问题。

400 请求是顺便说一句。很多。

关于java - 操作超时和连接重置 - 400 并发访问 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18508781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com