我正在使用以下架构构建一个webapp:
以下是我正在使用的版本:
我的数据库架构非常复杂,包含36个表,其中一些表包含数百条记录。数据库并不是经常写数据,而是主要用于读取数据。
但是最近我在Backend中创建了一个脚本来对DB中包含的数据进行全面检查:基本上这个脚本检索所有表的所有数据并对数据进行一些基本检查。目前,该脚本只能读取数据库。
为了实现我的脚本,我必须使用pagination: false
选项删除Epilogue的分页限制(请参阅https://github.com/dchester/epilogue#pagination)。
但是现在当我启动脚本时,我随机获得了那种错误:
尝试使用网址http://localhost:3000/CallTypes/178/RendererThemes检索唯一关联的对象时,请求失败。
代码:-1
消息:错误:连接ECONNRESET 127.0.0.1:3000
在脚本执行期间随机出现错误:然后并不总是返回此URL,甚至不总是相同的表或关系。代码之前的错误消息是Backend返回的自定义消息。
该URL是对DBService的引用,但我没有看到任何错误,即使在Sequelize和logging: console.log
中使用DEBUG=express:*
来查看Express中会发生什么。
我试图在我的后端脚本中添加一些setTimeout来减慢速度,而没有真正的改变。我还试图操纵不同的值,如PostgreSQL max_connections
限制(我将限制设置为1000个连接),或者Sequelize maxConcurrentQueries
和pool
值,但尚未成功。
我没有找到我可以自定义Express的池连接的地方,也许它应该做的伎俩。
我认为错误来自DBService,来自Express配置或DB配置中的某个位置(在Sequelize / Epilogue中,甚至在postgreSQL服务器本身中),但因为我没有在任何日志中看到任何错误我不确定。
有什么想法可以帮我解决吗?
修改
经过进一步调查后,我可能找到了与How to avoid a NodeJS ECONNRESET error?非常相似的答案 :我正在使用自己的对象RestClient来执行我的http请求,并且使用此方法将此对象构建为单例:
var NodeRestClient : any = require('node-rest-client').Client;
...
static getClient() {
if(RestClient.client == null) {
RestClient.client = new NodeRestClient();
}
return RestClient.client;
}
然后我总是使用相同的对象来完成我的所有请求,当进程太快时,它会创建冲突......所以我刚刚删除了测试if(RestClient.client == null)
,现在它似乎工作了。
如果有更好的方法来管理它,通过关闭请求或管理池可以随时贡献:)