我正在云运行上运行一个不和谐的机器人(并不理想,但云构建速度要快得多,管理成本要便宜得多),我希望将其连接到公共 IP 上的云 mySQL 数据库。当尝试创建连接池并使用该连接池时,收到很多 特别是 ETIMEDOUT。
它是通过在我的构建脚本中创建 dockerfile 来部署的,不知道这是否重要。
function createConnectionPoolCloud(){
const dboptions = {
connectionLimit : 10,
socketPath: process.env.INSTANCE_UNIX_SOCKET,
user : process.env.DB_USER,
password : process.env.DB_PASS,
database : process.env.DB_NAME,
waitForConnections: true,
connectTimeout: 5000
}
return mysql.createPool(dboptions);
};
这是我正在使用的代码,我正在使用 msql2 库。
我已将云 sql 实例连接到我的云运行部署,并在服务帐户上拥有云 sql 管理员和客户端角色。我已经测试了与本地计算机的 sql 连接,并且可以正常工作。我已经玩过一点超时,但无论持续时间长短,它都会超时。我还确保了 unix 套接字是正确的 /cloudsql/instanceconnectionname。
我也遵循了这些说明,并且我设置了云 sql、运行和 sql 管理 API。
不知道到底是什么原因造成的,当我使用该函数创建池并执行
pool.promise()
然后执行 promisePool.query().
时,我就会收到错误 看了其他一些帖子,似乎没有一个解决方案有效出去。在我的本地计算机上,我记录整个池对象只是为了确保我可以看到某些内容,但这些内容根本不会出现在云日志中,这可能只是记录整个对象的本质,但值得一提。
我遵循了相同的说明,它对我有用。
const mysql = require('mysql2/promise');
const dboptions = {
socketPath: '/cloudsql/<PROJECT_ID>:<REGION>:<INSTANCE_NAME>',
user: 'root',
password: 'my-password',
database: 'my-database',
waitForConnections: true,
connectTimeout: 5000
}
const pool = await mysql.createPool(dboptions);
const [result] = await pool.query( `SELECT NOW();`);
console.table(result); // prints returned time value from server
您应该考虑使用 Node.js 连接器,因为它将为您处理证书和 mTLS 连接的管理。而且它不需要附加“Cloud SQL Connection”。
以下是如何启动新的
mysql2
连接池。
import mysql from 'mysql2/promise';
import {Connector} from '@google-cloud/cloud-sql-connector';
const connector = new Connector();
const clientOpts = await connector.getOptions({
instanceConnectionName: 'my-project:region:my-instance',
ipType: 'PUBLIC',
});
const pool = await mysql.createPool({
...clientOpts,
user: 'my-user',
password: 'my-password',
database: 'db-name',
});
const conn = await pool.getConnection();
const [result] = await conn.query( `SELECT NOW();`);
console.table(result); // prints returned time value from server
await pool.end();
connector.close();
更多信息请访问 https://github.com/GoogleCloudPlatform/cloud-sql-nodejs-connector#using-with-mysql