0

非同期でクエリを実行できる非同期 ExecuteQuery 関数を作成したので、ループ内で呼び出された場合、次のクエリは実行前に前のクエリが終了するのを待ちます。doCreatePool関数は、プログラムの初期化時に 1 回呼び出されます。接続プールを作成し、それをグローバル変数 config.Oracle_POOL に保存して、doCreatePool が戻った後でも接続プールが有効なままになるようにします。

Socket.io イベントは ExecuteQueryを呼び出してクエリを実行します (ループ内の 1 つまたは複数)。

すべてがうまくいきますが、一定量のクエリが実行された後、選択、更新、および挿入クエリのいずれかで「エラー: ORA-01000: 開いているカーソルの最大数を超えました」という ORA-1000 エラーが発生します。

通常、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);
                    }
                );
            });
        }
    });     
            
        
}
4

1 に答える 1

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が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 は、ExecuteQuery と getConnexion の後に RelaseConnexion が正常に呼び出されたことを通知することに注意してください。すべてのシーケンスが順次実行されること。

release connexion を使用しない場合 (ループ内で複数のステートメントを実行することを意味します)、config.Oracle_POOL.connections は安定したままです。 しかし、ループの最後で接続を句し、イベントが発生すると、新しいループが開始され、新しい接続が作成され、config.Oracle_POOL.connections が増加します...

于 2015-06-06T10:14:42.530 に答える