Sequelize.js关闭SQLite连接后如何通过原有实例重新连接
核心原因
调用sequelize.close()后,Sequelize除了销毁连接池,还会将connectionManager的closed标记设为true,仅调用initPools()不会重置这个标记,因此后续所有数据库操作都会判定连接已关闭,抛出错误。此外close()是异步方法,未等待关闭完成就执行后续操作,也会导致时序异常。
方案1:保留原有实例重连
手动重置连接管理器的关闭状态即可,适配Sequelize v6及以上版本:
// 等待关闭连接完成,必须加await await sequelize.close() // 执行修改SQLite文件等操作 // ... // 重置连接管理器的关闭标记 sequelize.connectionManager.closed = false // 重新初始化连接池 await sequelize.connectionManager.initPools() // 验证连接 await sequelize.authenticate()
方案2:新建实例重连(更稳定,推荐生产环境使用)
不需要依赖Sequelize内部未公开属性,兼容性更强:
// 封装实例初始化方法 function createSequelizeInstance() { return new Sequelize('database', null, null, { dialect: 'sqlite', storage: 'db.sql', define: { timestamps: false, freezeTableName: true }, dialectModule: sqlite3 }) } // 首次初始化 let sequelize = createSequelizeInstance() // 关闭连接并销毁原有实例 await sequelize.close() sequelize = null // 执行修改SQLite文件等操作 // ... // 重新初始化实例并验证 sequelize = createSequelizeInstance() await sequelize.authenticate()
内容的提问来源于stack exchange,提问作者Su_yj
相关产品推荐
相关产品推荐

