连接池常用的三种(连接池的配置)

lxf2023-11-20 01:20:01
NodeJS

上图中,nodejs有两个连接,分别向redis服务器发送查询请求。因为redis是单线程作业,无论两个查询任务是一个连接发送还是多个连接发送,无论任务是串联发送还是并行发送到服务器,redis都会逐个执行,并通过当前连接返回给客户端(这里是nodejs)。nodejs收到redis的返回后,是否并行就不重要了。它要等到nodejs 空的主线程空闲,才能逐个处理服务器返回的数据。

所以从上面的结论来看,nodejs+redis只需要共享一个连接,所以不需要使用连接池。

我们来看看nodejs+mysql下的情况。

不同的是mysql不是单线程的,也就是可以并行处理多个查询请求。

如上所示,mysql将为每个要查询的连接创建一个单独的线程。不像redis,数据基本都在内存中,因为mysql会有大量的IO操作来读取磁盘,所以多线程协同工作会比一个查询更快。

但是nodejs是单线程的,可以同时向mysql服务器发送多个请求吗?

这里要理解nodejs的操作,虽然nodejs是一个主线程,但是它调用的IO指令是由另一个线程完成的。IO指令完成后,给主线程一个小任务片,也就是回调函数。

这里的关键点是nodejs有一个主线程,但是会有多个IO线程。

因此,如果nodejs+mysql只使用单个连接,它将无法利用mysql同时服务多个查询的能力。它应该以类似下图的方式工作。nodejs使用多个连接来连接mysql。多连接需要连接池,这避免了创建和销毁每个连接的消耗。

所以我们的第一感觉是,认为Nodejs是单线程,不需要连接池的想法是错误的。它不仅依赖于客户端,还依赖于数据库服务器。我们必须充分了解整个系统的运行模式,才能得出结论。了解服务器的运行方式,是否有阻塞运行,是否多线程等。我觉得redis之所以设计成单线程,主要是因为它的数据基本都在内存中,查询数据的过程绝不会产生阻塞进程,cpu也不会处于空空闲状态。

全局断开和重新连接问题

它不在这里。基于以上分析,nodejs+mysql使用线程池是没有问题的。Nodejs+redis只需要一个连接。但是,有些人仍然建议需要连接池。为了说明问题,我们必须从代码开始。我们使用包node-redis作为例子

例如,创建了一个新的db.js。

var redis = require("redis"),client = redis.createClient(6379, "127.0.0.1");module.exports = client;

上述连接将在程序启动并加载后连接。当您使用它时,您可以通过引入它来使用一个全局唯一的连接。

var db = require("db.js");exports.add = function(req, res, next) { db.get("keyName", function() {res.send("ok");});}

所以这里就出现了这样一个问题。

但是这里整个世界只有一个连接,这个连接是在程序启动的时候创建的。它不同于连接池中的连接,连接池是在运行时动态创建的。如果唯一的连接在某个时候断了,程序就不会动态创建连接,所以需要重启服务器。

看起来很可怕,但幸运的是这个问题不存在。不需要重启服务器,因为redis的客户端会自动重新连接。

但由于连接短时间断开,应用服务器无法正常为外界服务,而是需要一定的时间间隔连接才能自动重新连接。例如,一秒钟后,系统在这一秒钟内停止服务。

也是基于以上原因,所以才有了连接redis使用连接池的做法。如果连接池用于管理,请在连接不可用时立即手动创建新连接。与自动重连相比,一种是立即手动重连,另一种是等待一定间隔再重连。相对来说,手动重连的时间更短,也就是说,1秒内系统无法服务的状态可能会缩短到0.5秒。于是就有了用连接池管理redis连接的做法。严格来说,这不是连接池,而是连接管理模块。

这里最后的结论是nodejs+mysql使用连接池更好,nodejs+redis可以用也可以不用。

adminjs.cn是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 Adminjs.cn还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 在Adminjs.cn中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!