2015-06-03 2 views
0

Я создали функцию асинхронного ExecuteQuery, который способен выполнить запрос асинхронно, так что если когда-нибудь это называется внутри цикла, следующее ожидание запроса на прежнем завершается до выполнена. doCreatePool функция вызывается один раз, при инициализации программы. Создает пул связей и сохраняет его в глобальной переменной config.Oracle_POOL, чтобы пул соединений оставался в живых, даже после этого doCreatePool возвращает.Connexion бассейн и ORA-01000

События Socket.io вызывают ExecuteQuery для выполнения запросов (одного или более в цикле).

Все идет правильно, но, после определенного количества запросов выполняется, я получаю ORA-1000 ошибка: «Ошибка: ORA-01000: максимальное открытых курсоров превысило» либо для выбора, обновления и вставки запросов ,

Как правило, пул Connexion должен избегать этой проблемы?

Что входит в мой код?

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); 
        } 
       ); 
      }); 
     } 
    });  


} 

ответ

0

Я знаю, где моя проблема. Добавив эти строки кода перед вызовом функции 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 increses, пока не достигнет poolMax (44). Вот почему я получаю erros, как (это мое мнение на данный момент):

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. Эта последовательность выполняется последовательно.

Если я не использую связь релиза (что означает выполнение нескольких операторов в цикле) config.Oracle_POOL.connections остаются стабильными. Но в конце цикла я устанавливаю связь, и когда происходит событие, он запускает новый цикл, и я создаю новую связь, затем config.Oracle_POOL.connections увеличивается ...

Смежные вопросы