创建oracle连接池,能不能把createpool和getConnection分开来写
node新手问题: 用的是oracle官方的包,oracledb.1.4.0,在创建连接池的时候,能把createPool和getConnection分开来写吗,先建立连接池,再创建连接,我如下改写了代码,却报错说getConnection不能识别,不明所以:
var config = require("../config").initConfig();
var oracledb = require("oracledb");
var m_Pool = null;
var numRows = 2;
var initOracleConnectPool = function() {
m_Pool = oracledb.createPool(config.m_Connect, function(err, pool) {
/* pool.getConnection( function(err , connection) {
if (err) { console.error(err.message); return; }
connection.execute(
"SELECT * " +
"FROM user_table " ,[],
function(err, result)
{
if (err) { console.error(err.message); return; }
else {
console.log(result.metaData);
console.log("begin");
fetchRowsFromRS(connection,result.resultSet,numRows);
//console.log(result.rows);
}
});
});*/
});
}
能不能改写为以下格式,方便先创建连接池,用的时候直接建连接就好:
//创建连接池
var initOracleConnectPool = function() {
m_Pool = oracledb.createPool(config.m_Connect, function(err, pool) {
console.log("the pool established ");
});
}
//创建连接,执行查询
exports.query = function() {
if (!m_Pool) {
initOracleConnectPool();
}
medusa_Pool.getConnection(function(err, connection) {
if (err) {
console.error(err.message);
return;
}
connection.execute(
"SELECT * " +
"FROM user_table ", [], {
resultSet: true,
prefetchRows: 2
},
function(err, result) {
if (err) {
console.error(err.message);
return;
} else {
console.log(result.metaData);
console.log("begin");
fetchRowsFromRS(connection, result.resultSet, numRows);
//console.log(result.rows);
}
});
});
}
3 回复
var globalPool;
var initOracleConnectPool = function() {
m_Pool = oracledb.createPool(config.m_Connect, function(err, pool) {
globalPool = pool;
exports.query = globalPool.query;
});
}
exports 放外面应该也行,但要确保第一个瞬间没有调用。
@MiguelValentine 我测了下,是执行query的时候还没有返回pool的值,但是像这种调用,如何得到返回值了再调用,看了好多帖子,都没怎么明白,我这个感觉是反着调用异步函数的。想在query中调用initOracleConnectPool的返回值,这样才能做到先创建好连接池,然后在应用需要的时候建立连接。
@MiguelValentine 我在query函数里加了定时器,得到了正确的结果,如果不用定时器,如何实现这种异步函数调用,还是得再多看看异步调用的实例。
var query = function(sqlReq, callback) {
if (!m_Pool) {
console.log("3"+m_Pool);
initOracleConnectPool();
}
setTimeout (function() {
console.log("4"+m_Pool);
m_Pool.getConnection(function(err, connection) {
if (err) {
console.error(err.message);
return;
}
connection.execute(
"SELECT * " +
"FROM user_table ", [], {
resultSet: true,
prefetchRows: 2
},
function(err, result) {
if (err) {
console.error(err.message);
return;
} else {
console.log(result.metaData);
console.log("begin");
fetchRowsFromRS(connection, result.resultSet, numRows);
//console.log(result.rows);
}
});
});
},10);
}