使用node-oracledb创建连接池,外部建立连接

来源:互联网 发布:中国无风险利率数据 编辑:程序博客网 时间:2024/05/22 02:27

接触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!!

线程池创建过啦
线程池已关闭

整体来看基本实现了外部连接线程池的需求,也避免了因同步导致创建多个连接池的问题




0 0
原创粉丝点击