非同期でクエリを実行できる非同期 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);
}
);
});
}
});
}