我已经组成了一条带有几条路线的快速服务器。计划是通过连接池为每个路由提供自己的mssql连接,但看起来模块只能有一个全局连接。我在这里做错了还是打算这样做?
另外,如果可能,我是否应该这样做?我应该为每个数据库使用一个API吗?所有这些数据库都在一个引擎上,并且是单独的模式。
答案 0 :(得分: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。正如拉努在评论中所说,层次结构为[database].[schema].[table]
。由于连接池访问数据库,因此您无需指定该位 - 您可以坚持使用[schema].[table]
,甚至可以根据您的设置省略架构。
现在关于你是否将池分开,显然你必须使用多个数据库。否则,如果它是相同的数据库,我认为我们需要更多的上下文,即便如此它也不是黑白的。
请记住,连接池是用户登录到数据库 - 它具有与该用户相同的权限。那么您是否希望RouteA
只能访问某些数据库对象并确保这是强制数据库端的?然后设置数据库用户(RouteAUser
),为该路由设置连接池(PoolA
),并在该池的配置中使用RouteAUser
的凭据,依此类推。如果所有数据访问都是在应用程序内部编写的,对最终用户是隐藏的,那么您可能不需要这样做 - 只需编写RouteA
的代码,以便它只访问您想要的对象。
答案 1 :(得分:0)
如果两个数据库需要一起查询怎么办?
mssql包允许您使用表限定符访问不同的数据库。
const result1 = pool.request().query("select * from DATABASE1..table1 t JOIN DATABASE2..table1 t2 ON t1.id = t2.id")