Node.js 面临来自DB2的频繁连接丢失(使用ibm_db版本-2.4.1)
我正在使用一个NodeJS应用程序,使用来自npm的ibm_db包创建与DB2服务器的连接。当应用程序首次启动时,连接成功,查询数据库将提供适当的结果。然而,经过一段时间后,应用程序不知何故失去了与数据库的连接 我正在使用连接池,在每次查询后都执行db.close()。 下一次对于后续查询,我再次执行pool.open(),我可以看到池仍然包含连接字符串,并且池大小为2 然而,我怀疑连接不知何故会过时,因为在这个时间点之后,查询数据库不会立即给出任何错误,也不会返回任何结果,我不断地看到空数组作为响应,几分钟后它会记录日志- SQL30081N检测到通信错误。沟通 正在使用的协议:“TCP/IP”。正在使用的通信API: “插座”。检测到错误的位置:“9.21.85.159”。 检测错误的通信功能:“发送”。协议 特定的错误代码:“10032”、“”、“”。SQLSTATE=08001 DB2实例托管在IBM Cloud-LINUX操作系统上, 我使用的是NodeJS版本-8,特别是8.11.5。我正在使用npm的ibm_db包进行间接TCP/IP连接 要解决此问题,我必须再次手动重新启动应用程序。但过了一段时间,这个问题再次出现 这个过程不断重复。 我不确定这是什么原因造成的。请帮帮我。我被这个问题困住了 下面是我用来连接数据库的代码。并处理查询 我已经尝试过更新ibm_db模块版本,但仍然不起作用Node.js 面临来自DB2的频繁连接丢失(使用ibm_db版本-2.4.1),node.js,db2,Node.js,Db2,我正在使用一个NodeJS应用程序,使用来自npm的ibm_db包创建与DB2服务器的连接。当应用程序首次启动时,连接成功,查询数据库将提供适当的结果。然而,经过一段时间后,应用程序不知何故失去了与数据库的连接 我正在使用连接池,在每次查询后都执行db.close()。 下一次对于后续查询,我再次执行pool.open(),我可以看到池仍然包含连接字符串,并且池大小为2 然而,我怀疑连接不知何故会过时,因为在这个时间点之后,查询数据库不会立即给出任何错误,也不会返回任何结果,我不断地看到空数组作
let Pool = ibmdb.Pool;
pool = new Pool({autoCleanIdle: true});
pool.setMaxPoolSize(2);
let cn = null;
if(process.env.NODE_ENV == 'production') {
if(process.env.IBMDB2_CONN_STRING) cn = process.env.IBMDB2_CONN_STRING;
else {
console.error('##############################################################');
console.error('##############################################################');
console.error('##############################################################');
console.error('Connection String for DB is Undefined.');
console.error('##############################################################');
console.error('##############################################################');
console.error('##############################################################');
process.exit(1);
}
}
const runQuery= (query,paramsValueArray)=>{
console.log('inside runQuery');
return new Promise(async (resolve,reject)=>{
console.log('inside promise')
try {
console.log(pool, '---POOL---');
pool.open(cn, (err, db) => {
console.log('inside pool.open')
if(err) {
console.log(err, '---error inside runQuery---');
reject(err);
return;
}
console.log(query, '----runquery----');
console.log(paramsValueArray, '---params value array---');
db.query(query,paramsValueArray,function(err,data){
if(err) {
console.log('error in executing Query, ----in runQuery----')
db.close(() => {
console.log('connection Disconnected');
});
reject(err);
return;
}
console.log('no error in query')
resolve(data);
db.close(() => {
console.log('connection Disconnected');
return;
});
});
})
}
catch(err) {
reject(err);
}
});
};
目前没有显示错误。但结果显示空数组
经过一段时间的查询处理后,一个错误显示-
SQL30081N检测到通信错误。沟通
正在使用的协议:“TCP/IP”。正在使用的通信API:
“插座”。检测到错误的位置:“9.21.85.159”。
检测错误的通信功能:“发送”。协议
特定的错误代码:“10032”、“”、“”。SQLSTATE=08001
编辑您的问题以添加新的事实:您的Db2服务器操作系统(z/OS、i-series、linux/unix/windows)是什么?运行node.js的操作系统(给出确切版本)是什么?TCP/IP连接是直接连接到目标Db2数据库,还是间接连接(例如通过像Db2 connect这样的网关)?@mao,我已经编辑了这个问题,并添加了Db2服务器操作系统详细信息和Node.js版本。然而,我使用ibm_db包连接到DB2,所以我认为这是间接的,对吗?所以您的TCP/IP连接(来自一些未指定的Linux发行版/版本)是到ibm cloud上托管的DB2 LUW。可能是由于不活动或其他原因导致与Db2数据库的连接超时,并且池软件没有自动重新连接。您可能需要为自动重新连接配置db2dsdriver.cfg。您的node.js版本很旧,您是否在测试环境中尝试过10.16或更高版本?此问题可能与配置有关,您可能会从github上的node-ibm_db issues列表中获得更具体的建议。@mao如何配置db2sdriver.cfg?Db2实例服务取自IBM云。如何访问其配置文件。文件?请参阅github node-ibm_db上与“池”和“重新连接”相关的建议。IBM文档位于。