簡體   English   中英

Node Express 多 SQL 服務器連接

[英]Node Express Multiple SQL server Connection

我需要連接到不同服務器上的不同數據庫。 服務器是 Microsoft SQL Server。

我這樣做:

數據庫配置文件

    var sql1 = require('mssql')
    var sql2 = require('mssql')

    var conn1 = {server:"SERVER IP", database:"db1", user:"foo", password:"foo", port:1433}

    var conn2= {server:"SERVER2 IP", database:"db2", user:"foo2", password:"foo2", port:1433}

var server1= sql1.connect(conn1)
    .then(function() {  debug('Connected'); })
    .catch(function(err) { debug('Error connect SQL Server', err);  });

    var server2= sql2.connect(conn2)
        .then(function() {  debug('Connected'); })
        .catch(function(err) { debug('Error connect SQL Server', err);  });

module.exports = {"ServerConn1": sql1, "ServerConn2": sql2};

之后,兩個連接都處於活動狀態,但是當我對第一個連接進行查詢時,它不起作用。

錯誤是無效的對象名稱“FooDatabase.dbo.fooTable”。

誰能幫我解決這個問題?

謝謝!

我使用 MySQL 實現你可以通過在創建連接之前傳遞空數據庫參數和字母更新數據庫來做同樣的事情 mssql。

而且您不需要導入兩次,只需在創建連接或查詢之前更新數據庫名稱。

const express = 

require('express');  
const app = express();  
const port = process.env.PORT || 80;
var http = require('http');
var mysql = require('mysql')
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',//here i am not passing db and db is undefined

});

app.get('/db1',function(req,res)
{
connection.config.database="task" //here  i updating db name before query
connection.query('SELECT * FROM tasks', function (error, results, fields) {
    console.log(results)
    res.json(fields)
connection.end()
})
})

app.get('/db2',function(req,res)
{
connection.config.database="cg_taskview" //db2

connection.query('SELECT * FROM tasks', function (error, results, fields) {
     if (error)
    console.log(error); 
    console.log(results)
    res.json(fields)
     });
connection.end()

})

var server = http.createServer(app);
server.listen(port, function () { 
})

下面是我的測試代碼:

var sql = require('mssql/msnodesqlv8');

const config = {server:'localhost', database:'TestDB', 
        options: { trustedConnection: true }};
const config2 = {server:'SomewhereNotExist', database:'TestDB', 
        options: { trustedConnection: true }};

(async () => {
  try { 
    let pool = await sql.connect(config);
    let result = await pool.request().query('select count(1) as cnt from AlarmWithLastStatus');
    console.log('DB1 result:');
    console.dir(result.recordset);

    let pool2 = await sql.connect(config2);
    let result2 = await pool2.request().query('select count(1) as cnt from AlarmWithLastStatus');
    console.log('DB2 result:');
    console.dir(result2.recordset);
  } catch (err) {
    if (err) console.log(err);
  }
}) ();

輸出: DB1 結果:[ { cnt: 12 } ] DB2 結果: [ { cnt: 12 } ]

您可以看到這兩個連接實際上指向同一台服務器。 如果您將第二個查詢更改為此服務器中不存在的表,則會生成您遇到的錯誤。

當第二個 MSSQL 服務器作為數據源添加到項目中時,我開始遇到類似的問題......幸運的是,我在tediousjs的示例中找到了解決方案。 只需使用 ConnectionPool 並且不要忘記關閉連接:

const settings  = require('./config');
const sql = require('mssql');

exports.someSqlQuery = async function(sqlQuery) {
  const cPool = new sql.ConnectionPool(config);
  cPool.on('error', err => console.log('---> SQL Error: ', err));

  try {
    await cPool.connect();
    let result = await cPool.request().query(sqlQuery);
    return {data: result};
  } catch (err) { 
    return {error: err};
  } finally {
    cPool.close(); // <-- closing connection in the end it's a key
  }
};

如果您的所有連接都將關閉,您可以使用與不同服務器上不同數據庫的連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM