1

我有一个使用MySQL数据库在Node.jsExpress上运行的应用程序。我正在使用的驱动程序是node-orm2。我们的用户不断报告“连接太多”错误,我已经诊断出问题,但我不知道如何解决它。

基本上发生的事情是,每次新用户访问该站点时,驱动程序都会为他们创建一个新线程/进程。我可以SHOW PROCESSLIST在 db 上进行查询,它会Time0.

如果用户进行另一个需要数据库的操作,则重新使用同一线程Time然后返回0. 但是,如果他们不这样做,线程将保持活动状态(带有Commandof Sleep),并且Time机架会上升。数据库的最大连接限制为250,超时为7200

所以基本上,如果超过 250 人在 2 小时内使用该网站,我们会看到“连接太多”错误。

我尝试使用连接池,但这使问题变得更糟。每次新用户使用数据库时,都会创建 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);
4

1 回答 1

1

连接池可能值得重新审视。连接池的一个卖点是您可以将它们配置为在一定时间后回收空闲或卡住的连接。因此,即使您的应用程序泄漏连接,数据库也会受到保护。

我知道这并不能解决线程的根本问题,但无论如何回收连接可能是谨慎的。

于 2014-11-26T21:55:24.157 回答