javascript 如何管理到一个MySQL示例和多个数据库的数据库连接?

ewm0tg9j  于 2023-05-16  发布在  Java
关注(0)|答案(2)|浏览(162)

我有一个MySQL示例,每个用户有一个数据库。我想构建一个API,它应该根据调用它的用户连接到正确的数据库。
对于此设置,管理数据库连接的最佳方法是什么?
在mysql node包的文档中,我发现了以下两个选项:
1.为整个示例创建一个池,然后使用changeUser连接到数据库,例如:

const pool = createPool({
    connectionLimit: 10,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    port: 3306, // default
    host: process.env.SQL_INSTANCE_HOST,
  })

const connection = await pool.getConnection();
connection.changeUser({ database: userDatabase }, (err) => {
    throw new Error(`Could not connect to database: ${err}`);
  });
// use connection, release it after usage

1.使用PoolCluster为每个数据库创建一个池,然后使用调用与用户对应的池:

const poolCluster = mysql.createPoolCluster();
poolCluster.add('USER1', config1);
poolCluster.add('USER2', config2);
poolCluster.add('USER3', config3);

const pool = poolCluster.of('USER1');
pool.query(function (error, results, fields) {
  // perform query
});

answer to an earlier question中,有人表示更喜欢使用PoolCluster而不是changeUser,但没有确切解释原因。
使用一个选项而不是另一个选项的利弊可能是什么?还有其他选择可以考虑吗?

kpbwa7wx

kpbwa7wx1#

为每个用户创建一个数据库是一个非常不寻常的设计。在某些情况下,这可能是有道理的,所以我想给你一个怀疑的好处,并假设你有一个很好的理由。
我的假设是你使用Node来构建一些API或Web服务,所以我认为你有两个选择:
1.如果你需要为每个用户建立一个单独的连接,那么我想我根本不会使用任何池,因为用户会很少访问你的服务,而且不值得保持任何连接打开。
1.如果您可以为多个用户重复使用连接,那么只需使用常规池。
例如,如果你有一个用户名/密码来访问MySQL,你可以用数据库名称作为每个表的前缀:

SELECT * FROM databasename.tablename

如果你把所有东西都加上前缀,你就不需要做什么特别的事情了。给每个人弄一个游泳池。

mwg9r5ms

mwg9r5ms2#

池用于同构连接。例如,同一数据库的多个备用连接。
这里有两个场景--
1.所有数据库的用户名和密码相同-您应该避免定期轮询。你可以使用Redis来重用这些连接。

  • 所有数据库的用户名和密码不同-
  • 首先,您需要将数据库凭据存储在主数据库中,其中Map的数据库包含用户。
  • 您可以将您的数据库连接存储在Redis中,而不必每次都创建数据库。
  • 您可以检查Redis中是否有此特定数据库的连接,使用它,否则创建它并存储在Redis中以备将来使用。

相关问题