下面是详细的讲解“Node.js使用MySQL连接池的方法实例”的攻略。
准备工作
在使用Node.js连接MySQL数据库之前,需要先安装Node.js和MySQL Server。此外,还需要安装MySQL Node.js驱动程序,可以通过npm命令安装:
npm install mysql
连接池的概念
连接池是一种连接数据库的方式。连接池本质上是一组数据库连接,它们可以被多个客户端共享。连接池的任务是管理连接,将它们提供给客户端。当客户端使用完连接之后,它将被返回到连接池中,以便其他客户端重复使用。连接池可以提高应用程序的性能、可扩展性和可靠性。
下面是一个使用连接池的示例:
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit : 10,
host : 'localhost',
user : 'root',
password : 'mypassword',
database : 'mydatabase',
multipleStatements: true
});
pool.getConnection(function(err, connection) {
if (err) throw err; // not connected!
console.log('Connected!');
connection.release();
});
在这个示例中,首先使用mysql.createPool()
方法创建一个连接池。连接池选项包括连接限制、主机名、用户名、密码、数据库名等。之后,调用pool.getConnection()
方法从连接池中获取一个数据库连接。如果获取连接时发生错误,则会抛出异常。如果成功获取连接,则可以使用该连接执行数据库查询操作。在查询完成后,需要调用connection.release()
方法将连接返回到连接池中,以便其他客户端可以使用该连接。
实例一:查询数据并返回结果
下面是一个示例,演示如何使用Node.js连接池从MySQL中查询数据并返回结果。在这个示例中,假设数据库中包含一个名为customers
的表。
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit : 10,
host : 'localhost',
user : 'root',
password : 'mypassword',
database : 'mydatabase',
multipleStatements: true
});
const query = (sql, values) => {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
return reject(err);
}
connection.query(sql, values, (error, results, fields) => {
connection.release();
if (error) {
return reject(error);
}
return resolve(results);
});
});
});
};
(async () => {
try {
const results = await query('SELECT * FROM customers');
console.log('Results:', results);
} catch (error) {
console.error('Error:', error);
}
})();
在这个示例中,定义了一个query()
函数,该函数将要执行的SQL语句和参数传递给连接池。使用Promise封装的方式异步处理返回结果。如果查询成功,则返回查询结果;如果出现错误,则抛出异常。
实例二:事务处理
下面是一个示例,演示如何使用Node.js连接池执行事务处理操作。在这个示例中,假设数据库中包含一个名为accounts
的表。
const mysql = require('mysql');
const pool = mysql.createPool({
connectionLimit : 10,
host : 'localhost',
user : 'root',
password : 'mypassword',
database : 'mydatabase',
multipleStatements: true
});
const transaction = async () => {
const connection = await new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
return reject(err);
}
return resolve(connection);
});
});
try {
await new Promise((resolve, reject) => {
connection.beginTransaction(error => {
if (error) {
return reject(error);
}
return resolve();
});
});
await new Promise((resolve, reject) => {
connection.query('UPDATE accounts SET balance = balance - 100 WHERE id = 1', (error, results, fields) => {
if (error) {
return reject(error);
}
return resolve();
});
});
await new Promise((resolve, reject) => {
connection.query('UPDATE accounts SET balance = balance + 100 WHERE id = 2', (error, results, fields) => {
if (error) {
return reject(error);
}
return resolve();
});
});
await new Promise((resolve, reject) => {
connection.commit(error => {
if (error) {
return reject(error);
}
return resolve();
});
});
} catch (error) {
await new Promise((resolve, reject) => {
connection.rollback(() => {
return resolve();
});
});
throw error;
} finally {
connection.release();
}
};
(async () => {
try {
await transaction();
console.log('Transaction completed');
} catch (error) {
console.error('Transaction failed', error);
}
})();
在这个示例中,定义了一个transaction()
函数,该函数使用连接池执行事务处理操作。在事务中,首先使用connection.beginTransaction()
方法开始事务处理;之后,依次执行两个SQL语句。如果执行出现错误,则使用connection.rollback()
方法撤销事务处理;否则,使用connection.commit()
方法提交事务处理结果。在无论事务成功、失败、或出现错误的情况下,都需要使用connection.release()
方法将连接返回到连接池中,以便其他客户端可以使用该连接。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js使用MySQL连接池的方法实例 - Python技术站