nodeJS express mysql 高并发时连接数不够用问题 以及如何处理高并发
2017-11-07 11:04
1706 查看
首先 描述下问题,前段时间接到了通知,做nodejs高并发代码优化,于是开始整咯,首先用loadrunning模拟高并发,问题就来了,到高并发路由的时候,会出现数据库连接数不够用的情况。查询了代码,都是一条语句执行完毕之后,:在callback中执行释放连接然后通知下一个语句去执行。应该是一个用户一个数据库连接就够了,而且我做了队列限制并发数,应该足够限制住连接数才对,可是每次还是蹭蹭蹭的往上飙然后连接数不够用报错。
经过一段时间的摸索,总结出原因,在代码中我用到了一个往同一张表中插入多条记录的时候递归插入,虽然每次执行完毕后会通知数据库释放连接,但接收到释放消息以及释放的时间远远大于逻辑处理时间,所以会有在高并发的时候连接数不够用的问题。也就只有在高并发的那个点会这样。
解决思路:将多条语句的insert整合成一条语句的insert语句,这样可以减少与数据库取得连接的开销,同时可以避免高并发的时候连接数不够用问题。
ps:附记录nodejs高并发的优化方向。本身nodejs对高并发处理真的特别牛逼,但是一个项目往往是由多个方便组成的,比如DB,静态资源,页面渲染等。那如何提高性能:nginx+redis+mysql+客户端渲染+ cluster。nginx处理静态资源cdn加速,redis作缓存(redis需要持久化关掉,同时将redis集群),mysql进行集群,页面渲染如果只依赖ejs那么高并发下ejs渲染量过大的话会很成倍的提高处理时间所以建议将一些渲染平摊到客户端的浏览器上。nodejs是单线程无法利用多核cpu?nonono,你可以利用多进程利用cpu的,cluster就可以让你做到nodejs将电脑多核利用起来。只要做到这些,nodejs处理高并发想并发多少就并发多少。
经过一段时间的摸索,总结出原因,在代码中我用到了一个往同一张表中插入多条记录的时候递归插入,虽然每次执行完毕后会通知数据库释放连接,但接收到释放消息以及释放的时间远远大于逻辑处理时间,所以会有在高并发的时候连接数不够用的问题。也就只有在高并发的那个点会这样。
解决思路:将多条语句的insert整合成一条语句的insert语句,这样可以减少与数据库取得连接的开销,同时可以避免高并发的时候连接数不够用问题。
ps:附记录nodejs高并发的优化方向。本身nodejs对高并发处理真的特别牛逼,但是一个项目往往是由多个方便组成的,比如DB,静态资源,页面渲染等。那如何提高性能:nginx+redis+mysql+客户端渲染+ cluster。nginx处理静态资源cdn加速,redis作缓存(redis需要持久化关掉,同时将redis集群),mysql进行集群,页面渲染如果只依赖ejs那么高并发下ejs渲染量过大的话会很成倍的提高处理时间所以建议将一些渲染平摊到客户端的浏览器上。nodejs是单线程无法利用多核cpu?nonono,你可以利用多进程利用cpu的,cluster就可以让你做到nodejs将电脑多核利用起来。只要做到这些,nodejs处理高并发想并发多少就并发多少。
相关文章推荐
- 如何处理PHP和MYSQL的并发以及优化
- 【图文】Ubuntu系统源码方式编译安装node.js以及express安装出现找不到命令的问题
- 如何处理PHP和MYSQL的并发以及优化
- 如何处理PHP和MYSQL的并发以及优化
- 翻译:如何在Node.js和Express中使用MySql
- 国内如何在Ubuntu安装NVM,Node.js以及Express
- Node.js的Express运行问题处理
- 嵌入式 RedHaLinux今日总结如何安装rpm包以及处理出现的安装问题
- node.js + express 使用socket.io 客户端出现socket.io.js 404的问题解决
- mysql全日志添加时间戳以及SQL多行问题处理(更新)
- node.js如何读取MySQL数据(转)
- Node.js,Express,Mysql小结1
- 在js中如何实现方法重载?以及函数的参数问题
- Mysql闪退现象以及JDBC访问时中文乱码问题处理
- Node.js express 版本出现的几个常见问题
- 如何解决MySQL超过最大连接数问题
- js中方法重载如何实现?以及函数的参数问题
- 安装node.js,CoffeeScript,Express.js,mysql,jade
- 在js文件中如何获取basePath处理js路径问题
- node.js如何读取MySQL数据