我使用 MySQL 数据库在 Node.js 和 Express 上运行应用程序。我正在使用的驱动程序是 node-orm2 。我们的用户不断报告“ Too Many Connections ”错误,我已经诊断出问题,但我不知道如何修复它。
基本上发生的事情是,每当新用户访问网站时,驱动程序都会为他们创建新的主题/流程。我可以对数据库执行SHOW PROCESSLIST
查询,它会显示Time
0
。
如果用户执行了另一个需要数据库的操作,则重复使用相同的线程,Time
将返回0
。但是,如果他们不这样做,则主题保持活动(Command
为Sleep
),并Time
机架向上。数据库的最大连接限制为250
,超时时间为7200
。
基本上,如果超过250人在2小时内使用该网站,我们会看到“Too Many Connections”错误。
我尝试使用连接池,但这使问题变得更糟。每次新用户使用数据库时,它都会创建10个线程,当达到7200秒超时时,线程重新生成。
我有什么选择?
我目前的方法是每隔半小时运行一次预定作业来关闭已经打开太久的线程,但是有更好的方法吗?
我正在使用以下设置:
db.settings.set("properties.association_key", "{name}Id");
db.settings.set("instance.autoFetch", true);
db.settings.set("instance.returnAllErrors", true);
db.settings.set("instance.cache", false);
答案 0 :(得分:1)
连接池可能值得重新访问。连接池的一个卖点是,您可以将它们配置为在一定时间后回收空闲或卡住的连接。因此,即使您的应用程序泄漏连接,数据库也会受到保护。
我知道这并没有解决线程的根本问题,但在任何情况下回收连接都可能是谨慎的。