我创建了一个异步ExecuteQuery函数,它能够异步执行查询,这样如果它在循环中被调用,那么下一个查询将等待前一个查询在执行之前完成。在程序初始化时,只调用一次doCreatePool函数。它创建一个连接池,并将其保存在全局变量config.Oracle_POOL中,以便连接池保持活动,即使在此之后doCreatePool返回。
Socket.io events调用ExecuteQuery来执行查询(一个循环中有一个或多个查询)。
一切正常,但是,在执行了一定数量的查询后, 得到了一个ORA-1000错误:"Error: ORA-01000:超出了最大打开游标“,用于选择、更新和插入查询。
正常情况下,连接池应该避免这个问题吗?
我的密码怎么了?
doCreatePool (); //Create a connexion pool and save it in config.Oracle_POOL
//dbConfig={....}
function doCreatePool () {
dbConfig=config.Settings.DataBaseConnexionString;
oracle.createPool (
{
user : dbConfig.user,
password : dbConfig.password,
connectString : dbConfig.connectString,
poolMax : 44,
poolMin : 2,
poolIncrement : 5,
poolTimeout : 4
},
function(err, pool)
{
if (err) {
console.error("createPool() callback: " + err.message);
return;
} else {
config.Oracle_POOL = pool;
}
});
}
function ExecuteQuery(Query, LstParam, callBack) {
config.Oracle_POOL.getConnection( function(err, connection) {
if (err){
console.log("Oracle connexion pool --> err --> ", err);
if (connection)
connection.release(
function(err) {
if (err) {
console.log("(1) connection.release --> err--> ",err)
}
}
);
callBack(err, { rows : [] });
} else {
var OracleQueryOptions={outFormat: oracle.OBJECT, maxRows : 500, autoCommit : true};
connection.execute(Query, LstParam, OracleQueryOptions , function(err, results) {
if (!err) {
console.log("* connection.execute --> err--> ",err, "Query --> ", Query);
}
connection.release( function(err2) {
if (err2) {
console.log("(2) connection.release --> err-->",err)
}
callBack(err, results);
}
);
});
}
});
}发布于 2015-06-06 10:14:42
我知道我的问题从何而来。通过在调用getConnexion()函数之前添加这些代码行
// NUMBER OF CONNCETIONS OPEN
console.log("B4getConnexion -> ORACLE: CONNX OPEN: " + config.Oracle_POOL.connectionsOpen);
// NUMBER OF CONNEXTIONS IN USE
console.log("B4getConnexion -> ORACLE: CONNX IN USE: " + config.Oracle_POOL.connectionsInUse);在getConnexion()函数调用的末尾:
// NUMBER OF CONNCETIONS OPEN
console.log("AFTER/getConnexion -> ORACLE: CONNX OPEN: " + config.Oracle_POOL.connectionsOpen);
// NUMBER OF CONNEXTIONS IN USE
console.log("AFTER/getConnexion -> ORACLE: CONNX IN USE: " + config.Oracle_POOL.connectionsInUse);我注意到config.Oracle_POOL.connectionsOpen不断增加,直到到达poolMax (44)为止。这就是为什么我会犯错误(这是我现在的观点):
ORA-24418: Cannot open further sessions
ORA-24418: Cannot open further sessions
ORA-01000: maximum open cursors exceeded如何避免config.Oracle_POOL.connectionsOpen增加?请注意,console.log通知RelaseConnexion是在ExecuteQuery之后成功调用的,然后是getConnexion。所有序列都是按顺序执行的。
如果我不使用release (这意味着在循环中执行几个语句),那么config.Oracle_POOL.connections保持稳定。但是在循环的末尾,I子句的连接,当事件发生时,它启动一个新的循环,我创建一个新的连接,然后config.Oracle_POOL.connections增加.
https://stackoverflow.com/questions/30623975
复制相似问题