首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接池和ORA-01000

连接池和ORA-01000
EN

Stack Overflow用户
提问于 2015-06-03 15:07:17
回答 1查看 79关注 0票数 0

我创建了一个异步ExecuteQuery函数,它能够异步执行查询,这样如果它在循环中被调用,那么下一个查询将等待前一个查询在执行之前完成。在程序初始化时,只调用一次doCreatePool函数。它创建一个连接池,并将其保存在全局变量config.Oracle_POOL中,以便连接池保持活动,即使在此之后doCreatePool返回。

Socket.io events调用ExecuteQuery来执行查询(一个循环中有一个或多个查询)。

一切正常,但是,在执行了一定数量的查询后, 得到了一个ORA-1000错误:"Error: ORA-01000:超出了最大打开游标“,用于选择、更新和插入查询。

正常情况下,连接池应该避免这个问题吗?

我的密码怎么了?

代码语言:javascript
复制
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);
                    }
                );
            });
        }
    });     
            
        
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-06 10:14:42

我知道我的问题从何而来。通过在调用getConnexion()函数之前添加这些代码行

代码语言:javascript
复制
// 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()函数调用的末尾:

代码语言:javascript
复制
// 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)为止。这就是为什么我会犯错误(这是我现在的观点):

代码语言:javascript
复制
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增加.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30623975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档