NodeJS中MariaDB执行查询后自动取消数据库选择的问题
问题原因
你遇到的问题核心在于数据库连接池的连接是独立复用的:
- 你在
connect函数里只给连接池中的一个连接执行了USE athletepresencelist语句,而连接池里的其他连接并没有设置默认数据库。 - 当后续调用
querydb时,连接池会随机分配空闲连接给请求,如果分配到的是没执行过USE的连接,自然就会出现"未选中数据库"的报错。 - 就算你尝试在
querydb里加USE语句,也可能因为连接池的复用机制,出现偶尔正常偶尔报错的情况(比如复用了已经设置过的连接就正常,拿到新连接就报错)。
解决办法
最简洁可靠的方案是直接在连接池配置中指定默认数据库,这样每个新创建的连接都会自动绑定该数据库,不需要手动执行USE:
修改你的db.js中的连接池配置:
const pool = mariadb.createPool({ host: 'demez.asuscomm.com', user: process.env.MARIADB_USER, password: process.env.MARIADB_PW, database: 'athletepresencelist', // 新增这一行,指定默认数据库 connectionLimit: 5 });
然后可以删掉connect函数里的await pool.query('USE athletepresencelist');,甚至可以简化connect函数——因为连接池会自动管理连接的创建与复用,不需要手动调用getConnection来初始化。
如果出于某些原因必须手动初始化每个连接,可以使用连接池的initConnect选项,让每个新连接创建时自动执行指定语句:
const pool = mariadb.createPool({ host: 'demez.asuscomm.com', user: process.env.MARIADB_USER, password: process.env.MARIADB_PW, connectionLimit: 5, initConnect: ['USE athletepresencelist;'] // 每个新连接都会执行这条语句 });
另外补充:你的原connect函数存在逻辑问题——pool.getConnection()拿到的连接对象没有被保存,后续调用pool.query会重新从池里获取新连接,导致你执行的USE语句只作用在一个未被复用的连接上,完全起不到全局设置的作用。
内容的提问来源于stack exchange,提问作者Silas Demez
相关产品推荐
相关产品推荐

