【问题标题】:Multiple mssql connections in express REST API快速 REST API 中的多个 mssql 连接
【发布时间】:2018-06-01 02:52:48
【问题描述】:

我已经用几条路线组成了一个快速服务器。计划是通过连接池为每条路由提供自己的 mssql 连接,但似乎该模块只能有一个全局连接。我在这里做错了什么还是故意的?

另外,如果可能的话,我应该这样做吗?每个数据库应该有一个 API 吗?所有这些数据库都在一个引擎上,并且是单独的架构。

【问题讨论】:

  • 我不完全确定您的问题是什么。您说,首先,您计划为“每个路由提供自己的 mssql”,您是说您将托管多个 SQL Server 实例,并且每个路由使用不同的实例?但是你接着说数据库都在一个数据引擎上,但是不同的模式..? Schema 是数据库中的一个对象,而不是相反。数据库不属于模式,模式属于数据库。这就是 3 部分命名约定的工作方式[database].[schema].[object]。即AdventureWorks.sales.Customers; sales 是架构。
  • 是的,就像我说的它们都在同一个引擎/服务器上,不同的模式。我已经尝试完全限定查询,但没有运气。
  • 是的,我可以看出你在说什么。我明白英语不是你的第一语言,这意味着你的句子可能会被错误地解释。
  • 好的,非常有帮助。谢谢...

标签: sql-server node.js api express routes


【解决方案1】:

该模块允许您设置连接池,作为用户连接到数据库。因此,如果要连接到不同的数据库,则必须使用不同的池。例如:

const config1 = {
    user: 'username',
    password: 'password',
    server: 'server1',
    database: 'database1',
    options: {
        // ...
    }
}
const config2 = {
    user: 'username',
    password: 'password',
    server: 'server1',
    database: 'database2'
    // ...
}

const pool1 = new sql.ConnectionPool(conf1, err => {
    // ...
})
const pool2 = new sql.ConnectionPool(conf2, err => {
    // ...
})

现在当你想访问database1 时,你使用pool1,以此类推。欲了解更多信息,refer to the mssql documentation。不过,这里的主题是,如果您想访问不同的数据库,您必须使用不同的连接池。还要注意如何在 SQL Server 周围使用“模式”一词。 Schema 在 SQL 的一般上下文中是指数据库或表的结构,但在 Microsoft 的 SQL Server 中,它也可以指允许您为数据库内的表命名空间以用于管理、所有权和安全目的的功能。请参阅this technet article 以获得更好的解释。正如 Larnu 在 cmets 中所说,层次结构为 [database].[schema].[table]。由于连接池访问数据库,因此您无需指定该位 - 您可以坚持使用[schema].[table],甚至根据您的设置省略架构。

现在关于您是否应该分离池,很明显,如果您使用多个数据库,则必须这样做。否则,如果它是同一个数据库,我认为我们需要更多的上下文,即使那样它也不是黑白的。

请记住,连接池是一个用户登录到一个数据库——它与那个用户拥有相同的权限。那么您是否希望RouteA 只能访问某些数据库对象并确保这是在数据库端强制执行的?然后设置一个数据库用户 (RouteAUser),为该路由设置一个连接池 (PoolA),并在该池的配置中,使用 RouteAUser 的凭据,等等。如果您的所有数据访问都写入应用程序内部,对最终用户隐藏,您可能不需要这样做 - 只需编写 RouteA 的代码,以便它只访问您想要的对象。

【讨论】:

    【解决方案2】:

    如果两个数据库需要一起查询呢?

    mssql 包允许您使用表限定符访问不同的数据库。

    const result1 = pool.request().query("select * from DATABASE1..table1 t JOIN DATABASE2..table1 t2 ON t1.id = t2.id")
    

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 2011-08-19
      • 2017-03-14
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多