【发布时间】:2019-05-29 09:45:19
【问题描述】:
我是 NodeJS 的新手(来自 PHP 背景)。与 PHP 的阻塞特性相比,我对 NodeJS 的异步特性有一个基本的了解。我创建了一些连接到 mysql 的应用节点并让它们正常工作。
我目前对在 Node 中执行查询的最佳方式的理解是:
- 创建连接池
- 当您需要执行查询时:
- 从池中获取连接()
- 执行查询
- .release() 连接
我处于需要迭代大量项目并将每个项目插入数据库的情况。做了以上没有奏效。我的想法是,由于每个查询都是并行执行的,因此列表中的下一项正在尝试获取连接,但由于之前的查询可能尚未完成,因此没有可用的连接。没有抛出任何错误,只是似乎没有放入项目。通过日志记录,我发现它从未达到运行 pool.getConnection() 回调的地步。
所以我认为我可以修改连接流程:
- 创建连接池
- 当您需要执行许多查询时:
- 从池中获取连接()
- 遍历需要查询的项目
- 执行查询
- .release() 连接
问题是,我如何知道何时可以安全地 .release() 我的连接?我不能只在我的 .query() 回调中执行此操作,因为在它之后可能会有更多查询。但我也不能在查询回调中不这样做,因为我知道我需要等待所有查询完成。我是否负责创建自己的逻辑来确定所有查询(以及所有可能的未来查询,即使它们尚未开始)何时完成?还是这只是没有完成的事情?
在 PHP 中,这将是微不足道的,因为它具有阻塞性质。我选择在这个应用程序中使用 NodeJS,因为它有时确实需要异步。但它在我的应用程序不需要它的地方强制我使用异步(在某些情况下不应该使用它)。
我不愿发布我的代码,因为它有点复杂,所以我不想分散这个特定主题的注意力。
【问题讨论】:
标签: mysql node.js asynchronous connection-pooling