如何从使用mysql.createConnection切换到mysql.createPool

时间: 2024-05-10 admin IT培训

如何从使用mysql.createConnection切换到mysql.createPool

如何从使用mysql.createConnection切换到mysql.createPool

我对使用nodejs进行数据库连接的工作方式还很陌生,但是我遇到的数据库连接问题无法正确关闭。我之前在这里已经问过几个问题,似乎每个人都在告诉我使用pool而不是我一直使用的方式。唯一的问题是,当我在线搜索有关pool中使用promise-mysql的信息时,每个人似乎都在使用一种非常简单且通用的方法,但是我正在使用sockets的复杂应用程序中使用它。因此,我想知道如何才能将使用createConnection()的旧方法改为使用pool,以期解决这些连接问题。

每次调用套接字时,它都会建立与数据库的连接,然后在完成后释放它,或者看起来如此。听起来这不是一个非常可扩展的方法,并且使用pool将有助于并行运行多个查询。

db.js:

import mysql from 'promise-mysql';
import env from '../../../env.config.json';
const db = async (sql, descriptor, serializedParameters = []) => {
    return new Promise( async (resolve, reject) => {
        try {
            const connection = await mysql.createConnection({
                host: env.DB.HOST,
                user: env.DB.USER,
                password: env.DB.PASSWORD,
                database: env.DB.NAME,
                port: env.DB.PORT
            })
            if (connection && env.ENV === "development") {
                //console.log(/*"There is a connection to the db for: ", descriptor*/);
            }
                let result; 

                if(serializedParameters.length > 0) {
                    result = await connection.query(sql, serializedParameters)
                } else result = await connection.query(sql);
                connection.end();
                resolve(result);
        } catch (e) {
            console.log("ERROR pool.db: " + e);
            reject(e);
        };         
    });
}

export default db;

这是我将如何创建连接以查询数据库的示例

inventory.js:

import db from '../API/db';

export const selectAllFromBuildItems = () => {
    return new Promise( async (resolve, reject) => {
        try {
            const getAllBuildItems = "SELECT * FROM mydb.build_items;"
            const response = await db(getAllBuildItems, "AllBuildItems");

            resolve(response);
        } catch (e) {
            console.log("ERROR inventory.selectAllFromBuildItems: " + e);
            reject(e);
        } 
    });   
};

如何更改代码,以便改用pool。我可以从我们的应用程序中调用很多不同的查询,因此我不太确定将采用哪种正确的方法。我看到有人说我应该创建一次pool,然后在整个应用程序中使用它,但是我不知道该去哪里。如果有人对我如何进行此切换有任何建议,那将对我有很大帮助。谢谢!

回答如下:
var pool = mysql.createPool({
  host:     env.DB.HOST,
  user:     env.DB.USER,
  password: env.DB.PASSWORD,
  database: env.DB.NAME,
  connectionLimit: 10
});
pool.prototype.releaseConnection = function releaseConnection(connection) {
    return this.pool.releaseConnection(connection.connection);
};
function connect() {
  return pool.getConnection().then(function(connection) {
    return connection
  }).catch(function(e) {
    console.log("Error Creating Connection");
    throw e;
  });
}
function selectAllFromBuildItems() {
  var sql_query = `SELECT * FROM mydb.build_items`;
  return connect().then(function(conn) {
    return conn.query(sql_query).then(function(rows) {
      pool.releaseConnection(conn);
      return rows;
    });
  }).catch(function(e) {
      console.log("ERROR inventory.selectAllFromBuildItems: " + e);
      throw e;
  });
}