接觸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!!
線程池創建過啦
線程池已關閉