我正在构建我的第一个单生产者/单消费者应用程序,其中消费者从队列中取出项目并将它们存储在 MySQL 数据库中。
以前,当它是单线程应用程序时,我会打开到数据库的连接,发送查询,关闭连接,并在每次新信息进入时重复。
通过生产者-消费者设置,处理数据库连接的更好方法是什么?我应该在启动消费者循环之前打开它一次吗(我看不出这有什么问题,但我确信你们中的一个好人会指出它,如果有的话)?或者我应该在循环的每次迭代中打开和关闭数据库连接(似乎浪费时间和资源)?
该软件在大约 30 台小型 Linux 计算机上运行,所有计算机都与同一个数据库通信。我认为 30 个同时连接不是问题,但我很想听听您的想法。
抱歉,如果这已被涵盖,我在任何地方都找不到它。如果有的话,一个链接就太好了。谢谢!
为了清晰起见进行编辑 我这里主要关注的是消费者线程的速度。从单线程切换到多线程的全部原因是单线程版本缺少传入信息,因为它正忙于尝试连接到数据库。鉴于生产者线程预计会以相当高的速率开始将信息转储到缓冲区中,并且缓冲区的大小受到限制,因此消费者在保持稳定的同时尽快处理缓冲区非常重要。
最佳答案
您的 MySQL 在处理数百个甚至数千个连接时应该不会有任何问题。
在每个消费者上,您应该设置一个连接池,使用来自您的消费者的连接池。如果您在单个线程(每个应用程序)中使用消息,则池只需要使用一个连接,但也可以使用和启动全部使用一个连接的并行线程。
使用连接池的原因是它会为您处理重新连接并保持事件状态。只需请求它建立一个连接并让它 promise 它将工作(它通过对数据库运行一个小的查询来实现这一点)。如果您有一段时间不使用连接并且连接被终止,池将只创建一个新连接。
关于mysql - 生产者消费者设置: How to handle Database Connections?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20642507/