- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
ERROR 1040(HY000): Too many connections:DB连接池里已有太多连接,不能再和你建立新连接。
数据库自己有个连接池,你的每个系统部署在机器时,那台机器上部署的系统实例/服务实例自己也有个连接池,你的系统每个连接Socket都对应DB连接池里的一个Socket连接,这就是TCP连接:
当MySQL告诉你Too many connections,就是在传达它的连接池的连接已经满了,你这业务系统不能再和它建立新的连接。
DB部署在64G内存大机器,而连接这台物理机的Java业务系统部署在2台机器,Java系统的连接池最大大小为200,即每个Java业务系统节点,最多和MySQL建立200个连接,共最多建立400个连接。
但这时若MySQL报异常Too many Connections,说明目前MySQL无法建立400个网络连接。这也太少了吧,这可是高配置机器!
于是检查了my.cnf,有个关键参数是max_connections,即MySQL能建立的最大连接数,设置的800。那为啥两台机器就只需建立400个连接都不行?
登录到MySQL机器,执行如下命令:
show variables like 'max_connections'
可观察到,当前MySQL仅建立了214个连接而已!难道MySQL根本不在乎我们设置的这参数?
检查MySQL启动日志:
Could not increase number of max_open_files to more than mysqld (request: 65535) Changed limits: max_connections: 214 (requested 2000)
Changed limits: table_open_cache: 400 (requested 4096)
MySQL发现自己无法设置max_connections为我们期望的800,于是强制为214!因为底层linux把进程可打开的文件句柄数限制为1024了,导致MySQL最大连接数是214!
Linux文件句柄数量被限制也会导致MySQL最大连接数被限制。
核心就如下命令:
ulimit -HSn 65535
然后就能用如下命令,检查最大文件句柄数是否被修改:
cat /etc/security/limits.conf cat /etc/rc.local
若都修改好之后,可在MySQL的my.cnf里确保max_connections参数也调整好了,然后重启服务器、重启MySQL,这样linux的最大文件句柄就会生效,MySQL最大连接数也会生效了。
此时再尝试业务系统去连接DB,就没问题了。
为何Linux最大文件句柄限制为1024时,MySQL最大连接数是214?MySQL源码中就是有个计算公式,算下来就是这样的结果。
linux默认会限制你每个进程对机器资源的使用,包括:
因为linux os设计的初衷,就是要尽量避免你某个进程一下子耗尽机器上的所有资源,所以他默认都是会做限制的。
对我们来说,常见问题就是文件句柄的限制。
因为若linux限制你一个进程的文件句柄太少,就会导致我们无法创建大量网络连接,我们的系统进程就无法正常工作。比如MySQL运行时,其实就是Linux上的一个进程,那么他其实是需要跟很多业务系统建立大量的连接的,结果你限制了他的最大文件句柄数量,那么他就不能建立太多连接了!
所以,你在生产环境部署了个系统,比如DB系统、MQ系统、存储系统、Cache系统后,都需要调整Linux的一些内核参数,这个文件句柄数量一定要调整,通常得设为65535。
比如Kafka之类的MQ,在生产环境部署时,若不优化linux内核参数,会导致Kafka可能无法创建足够的线程,此时也无法运行。
所以可用ulimit命令设置每个进程被限制使用的资源量,用
# 进程被限制使用的各种资源的量
ulimit -a
设置之后,要确保变更落地到/etc/security/limits.conf文件,永打印限制
所以执行ulimit -HSn 65535命令后,要用如下命令检查一下是否落地到配置文件里去了。
cat /etc/security/limits.conf
cat /etc/rc.local
我正在努力学习本教程 https://github.com/cf-platform-eng/spring-boot-cities/tree/master/cities-service在 Cloud F
0){ echo "Username or email already exists."; }else{ $query = mysql_que
我想在Linux上编译ARToolKit源码,下载源码,按照ARToolKit文档,配置GLUT , OpenGL, libjpeg 等库。 转到 ARToolKit 目录并键入 ./Configer
你好,我在这个程序中遇到错误,wcout 不是 `std' 的成员。如您所见,我也使用了 iostream,但没有用。我有 Dev-C++ 4.9.9.2,我的操作系统是 XP SP3我需要你的帮助。
我尝试对一个网站进行多次投票,但我得到: panic: runtime error: invalid memory address or nil pointer dereference [signal
当我将“ using namespace std; int main(){ string s[30]; int n = 20; for(int i = 0; i using
我设置了 EMAIL_URL process.env.MAIL_URL="smtp://xx%40gmail.com:yyy@smtp.gmail.com:465" 这个工作找到了 Email.sen
我有如下文件夹结构 . ├── docker-compose.yml └── web-app ├── create_tomcat_admin.sh ├── Dockerfile
这是我在 php 中的查询代码: $query3 = mysql_query("SELECT * FROM area_of_work") or die('Invalid query:'. mysql_
我正在尝试将 therubyracer/therubyracer-heroku 安装到我的应用程序,因为它在 heroku 服务器中不起作用,因为我没有 javascript 运行时环境。 当我尝试安
我正在开发一个非常简单的 React 应用程序。它有一个组件,在这个组件中,我试图在单击链接时设置状态。但出于某种原因,setState 甚至没有得到认可。它带有下划线,表示未解析的函数或方法 set
我有三个来源:代码处理.h typedef enum {typeBool, typeVarDeclaration, typeFuncDeclaration } nodeEnum; typedef st
我正在尝试从我的 Android 手机向 raspi 发送连续的命令。我使用了此链接中的代码,但出现错误。 链接:https://stackoverflow.com/questions/2347143
我正在尝试从数据库中加载数据并将其放入不同的 View 中。 log cat 返回错误,它找不到“_id”列。 有人可以帮我解决这个问题吗? SqlHelper代码: public class Fib
我的alertview给出了这个问题..它与sqlite无关..它给出了一些信息.. 我该如何解决这个问题? UIAlertView *infoShow = [[UIAlertView alloc]
这个问题在这里已经有了答案: launch activities from different package (5 个答案) 关闭 10 年前。 最近我一直在开发一个新的应用程序,我正在尝试使用
这是我的代码: #include #include typedef struct test { int *a; char *s; }TEST; int main (void) {
所以我定义了一个函数,如果它是由它的 lonesome 实现的,那么它非常适合对线性数组进行合并排序,但是如果我把它放到一个类中,它就会出错。我认为这是一个很好的例子,说明我不太了解类(class)的
我是 IOS 新手。我有一个示例项目,并试图在此基础上学习 Obj-C。 现在我正处于学习如何使用 UIAlertController 的阶段。我有这样的代码: if (loanAmount == 0
当我尝试使用 wincachegrind 并获取 cachegrind 文件时,它返回 Cannot find call target. cachegrind.out line number:68 有
我是一名优秀的程序员,十分优秀!