使用node-oracledb創建連接池,外部建立連接

接觸node也有一小段時間了,之前練習一直使用的是mariadb(centos默認這個),使用node加載mysql驅動使用一切正常

碰到的絕大部分問題都可以查到,案例代碼也相當多

但是近期由於業務需求轉用oracle,先不提在centos上安裝oracle client上有多吐血,各種依賴啊環境變量啊啥的,

node連接oracle的資料國內實在是太少了,而且在去年發佈官方版本之前還存在一些大神開發的"原始版"的驅動(這裏有人說山寨版,但是人家是在官方版之前發佈的啊)

導致了網上一些關於node-oracle的資料文章所針對的驅動大相徑庭,代碼自然也是匹配不少

所以在使用node-oracle之前希望諸位先確認自己使用的是否是官方驅動

正是因爲冷門所以我覺得有必要寫下如何使用node-oracledb創建連接池,外部建立連接這個基礎的操作

首先先看下mysql下node是如何創建連接池的

var mysql = require('mysql'); 

var pool = mysql.createPool({
host : “hostName”,
user : “username”,
password: “password”
});

pool.getConnection(function(err, connection){

});

沒錯就是這麼簡單,在創建線程池後就可以直接使用了

正是因爲有這種慣性思維,在創建oracle的線程池的時候我便使用了同樣的方法

var pool = oracledb.createPool(

        {
          user              : dbConfig.password,
          password          : dbConfig.password,
          connectString     : dbConfig.connectString
        },
        function(err, pool){
          ...
        }
);
pool.getConnection(function(err, connection){

});



然後...就懵逼了....

報錯原因是

Cannot read property 'getConnection' of undefined

很顯然是這個pool沒有創建出來

爲什麼沒有創建出來呢,這個問題應該先問問谷歌百度,但是查了半天卻只找到了這麼一篇文章 查看文章

基本上是明白啥原因了,明顯是因爲非阻塞導致的在創建pool之前先建立了連接,如果直接使用定時器去做阻塞未免有些原始,

因此在對async異步做了簡單瞭解後,便對代碼略加修改最終實現了外部建立連接

var oraclepool;

//①定義線程池

var getnewpool = function (poolstats){
    oracledb.createPool({
        user: dbconfig.user,
        password: dbconfig.password,
        connectString: dbconfig.connectString
    },function (err,pool) {
        oraclepool = pool;//把創建的線程池轉爲全局變量
        console.log("connectpool establish!!");
        poolstats(err,null);
    })
}

//檢查線程池存在與否

var checkpool = function (cb) {
    if(oraclepool == undefined){
        getnewpool(cb);
    }else{
        console.log("線程池創建過啦");
        cb(null);
    }
}

//連接線程池操作

var getpoolinfo = function(poolstats) {
    oraclepool.getConnection(function(err, connection) {
//這裏記得返回一下poolstats
    });
}

//第一次執行sql

async.series([
checkpool,
getpoolinfo,
], function (err, result) {
    if(err) console.log(err);
});

//第二次執行(這裏爲了模擬用戶操作同時避免同步造成創建多個線程池)
setTimeout(function () {
   async.series([
        checkpool,
    getpoolinfo
 ], function (err, result) {
         if(err) console.log(err);
        oraclepool.close();
        console.log("線程池已關閉");
   });
},2000);

這裏聲明瞭建立連接池,檢查連接池是否建立,執行sql語句,模擬用戶二次執行sql語句

運行後可得結果

connectpool establish!!

線程池創建過啦
線程池已關閉

整體來看基本實現了外部連接線程池的需求,也避免了因同步導致創建多個連接池的問題




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章