我有一个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,但没有确切解释原因。
使用一个选项而不是另一个选项的利弊可能是什么?还有其他选择可以考虑吗?
2条答案
按热度按时间kpbwa7wx1#
为每个用户创建一个数据库是一个非常不寻常的设计。在某些情况下,这可能是有道理的,所以我想给你一个怀疑的好处,并假设你有一个很好的理由。
我的假设是你使用Node来构建一些API或Web服务,所以我认为你有两个选择:
1.如果你需要为每个用户建立一个单独的连接,那么我想我根本不会使用任何池,因为用户会很少访问你的服务,而且不值得保持任何连接打开。
1.如果您可以为多个用户重复使用连接,那么只需使用常规池。
例如,如果你有一个用户名/密码来访问MySQL,你可以用数据库名称作为每个表的前缀:
如果你把所有东西都加上前缀,你就不需要做什么特别的事情了。给每个人弄一个游泳池。
mwg9r5ms2#
池用于同构连接。例如,同一数据库的多个备用连接。
这里有两个场景--
1.所有数据库的用户名和密码相同-您应该避免定期轮询。你可以使用Redis来重用这些连接。