mysql - 使用mysql2-promise和node创建多个新的Mysql数据库连接

标签 mysql node.js

因此,我需要更改 Mysql 数据库,一些异步调用将使用该数据库来读取数据库。

有一个数据库,有一个包含多个数据库名称的表,我可以在其中读取数据库名称。并相应地更改我的数据库。

但是如果旧的读取操作正在进行中,数据库连接就会被修改。

如何创建新的数据库连接,同时保留旧的数据库连接?

即使两者都有 2 个不同的变量名称。

下面是index.js路由文件。

var mysqldb = require('mysql2-promise')();
var config = require('../config.js');
function scheduledSync( req, res, next ){
    var companyIds = [];

    var getCompanies = function (){
       var deferred = Q.defer();    
       schema.getModel('Company').find([] , function(  err, data ){
           if(err){
               deferred.reject();
           } else{
               deferred.resolve( data );
           }
       });
       return deferred.promise;
    }

    getCompanies().then(function(companyData){
        promise.each( companyData, function( company ){
            mysqldb.configure( config.sql );
            var companyQuery = "SELECT * FROM companies WHERE id = "+company.company_id+"";
            return mysqldb.query( companyQuery ).spread(function( rows ){
                var value = rows[0];
                var lastUpdated = company.lastUpdated.toISOString().replace(/T/, ' ').replace(/\..+/, '');
                if( value != null ){
                    return callAPIs( value, value.id, lastUpdated ).then(function(){
                        console.log( 'Company '+company.company_id + ' Migrated' );
                    }, function(error) {
                        console.log('rejection');
                    });
                }
            });
        }). then(function(){
            response = 'success';
            return response;
        });
    });
}

var callAPIs = promise.method( function( companyData, companyId, lastUpdated ){
    config.companysql.database = companyData.dbname;
    url = companyData.domainname;
    var promises = [
        areas.getAreaData( config.companysql, companyId, lastUpdated ),
    ];
    Q.all(promises).then( function( values ){
        var lastPromise = [
            company.getCompanyData( config.companysql, url, companyId, lastUpdated )
        ];
        Q.all(lastPromise).then(function(){
            complete();
            complete();
            return true;
        })
    });
});

下面是 config.js 文件。

var _ENVIRONMENT = 'Development';
//process.env.NODE_ENV = env;
/**
    We will configure the database credentials as well as API Layer End point based on the environment selected.
*/
switch (_ENVIRONMENT) {
    case 'Development': 
        var _DBHOST             = 'dummyhost'
        ,   _DBUSER             = 'xxxxxxx'
        ,   _DBPASS             = 'xxxxxxx'
        ,   _DBNAME             = 'xxxxxxxx'
        ,   _MONGOURL           = 'mongodb://dummyhost:27017/xxxxx'
        ,   _DEBUG              = false;
    break;

    case 'Staging':
        var _DBHOST             = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
        ,   _DBUSER             = 'xxxxxxxxxx'
        ,   _DBPASS             = 'xxxxxxxxxxxx'
        ,   _DBNAME             = 'xxxxxxxxxxxxxxxx'
        ,   _MONGOURL           = 'mongodb://xxxxxxxxxxx:xxxx/xxxxx'
        ,   _DEBUG              = false;
    break;
    // case 'Production':
    // break;
    default:
}

module.exports = {
    sql: {
          host                  : _DBHOST
        , user                  : _DBUSER
        , password              : _DBPASS
        , database              : _DBNAME
        , debug                 : _DEBUG
    },
    companysql: {
          host                  : _DBHOST
        , user                  : _DBUSER
        , password              : _DBPASS
        , database              : ''
        , debug                 : _DEBUG
    },
    mongourl                    : _MONGOURL
}

在area.js

var companyDB = require('mysql2-promise')();
var getAreaData = function( config, companyId, lastUpdated ){
    companyDB.configure( config );         
/*

Manipulate Area Table

*/
}

最佳答案

我用 mysql poolcluster 解决了 promise 问题。 如果其他人需要任何帮助,请发布它

var poolCluster = mysql.createPoolCluster();
poolCluster.add( 'MASTER', config.sql );
schema = promise.promisifyAll(schema);


var getsignupdata = function( compIdUpdate, companyIds, mysqldb ){
    var deferred = Q.defer();   
    var companyQuery = "SELECT * FROM companies WHERE id IN ("+companyIds+") ";
    poolCluster.getConnection( 'MASTER', function ( err2, mysqlcon ) {
        mysqlcon.query( companyQuery , function( err, rows ){
            if( !err ){
                for( i in rows ){
                    var companyId = rows[i].id;
                    config.companysql.database = rows[i].dbname;
                    poolCluster.add( 'SLAVE'+companyId,  config.companysql );
                    if( compIdUpdate != null )
                        rows[i]['lastUpdated'] = compIdUpdate[""+companyId];
                }
                deferred.resolve( rows );
            } 
        });
    });
    return deferred.promise;
};

function scheduledSync( req, res, next ){
    getCompanies().then(function( data ){
        getsignupdata( data.compIdUpdate, data.companyIds, mysqldb ).then(function( companyData ){
            console.log("scheduledSync " + companyData);
            promise.map( companyData, function( company ){
                var lastUpdated;
                if(company.lastUpdated != null)
                    lastUpdated = company.lastUpdated.toISOString().replace(/T/, ' ').replace(/\..+/, '');
                else
                    lastUpdated = null;
                if( company != null ){
                    return callAPIs( company, company.id, lastUpdated ).then(function(){
                        console.log( 'Company '+ company.id + ' Migrated' );
                    });
                }
            }). then(function( err ){
                response = 'success';
                return response;
            });
        });
    });
}

var callAPIs = promise.method( function( companyData, companyId, lastUpdated ){
    poolCluster.getConnection( 'SLAVE'+companyId, function ( err, companyConfig ) {
        entity.getEntityData( companyConfig, companyId, lastUpdated ).then(function(){
            areas.getAreaData( companyConfig, companyId, lastUpdated );
            discount.getDiscountData( companyConfig, companyId, lastUpdated );
            holderscheme.getHolderSchemeData( companyConfig, companyId, lastUpdated );
            scheme.getSchemeData( companyConfig, companyId, lastUpdated );
            skunits.getSkunitData( companyConfig, companyId, lastUpdated );
            stockAtWarehouse.getStockAtWareMap( companyConfig, companyId, lastUpdated );
            company.getCompanyData( config.companysql, companyData, companyId, lastUpdated );
        });
    });
});

关于mysql - 使用mysql2-promise和node创建多个新的Mysql数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178587/

相关文章:

mysql - 根据另一个表中的列对 MySQL 表进行分区

mysql - 具有多个 JOIN 的表的 Slick Plain SQL 隐式 GetResult

mysql - 数据库表设计 : normalization or not

node.js - 带有 node.js 机器人框架的 Skype 语音识别 API

javascript - 如何运行 csscomb.js?

node.js - Firebase 有上传限制吗?

PHP MYSQL 查询按类别排序

javascript - http.get 或 http.request 回调仅在 shell 中显示 - node.js

javascript - 在对象的对象中访问值

mysql - 我可以将 2 个不同的查询(返回单个记录)合并到一个返回单个记录的查询中吗?