Node-数据库高并发createPool

举报
林太白 发表于 2024/11/22 09:43:23 2024/11/22
【摘要】 Node-数据库高并发createPool

Node-数据库高并发createPool

1、 mysql模块的认识

Node.js使用mysql模块与数据库交互的两种主要的连接方式:createPoolcreateConnection

在Node.js中,mysql模块通常用于与MySQL数据库进行交互。mysql模块提供了两种主要的连接方式:createPoolcreateConnection。它们之间的主要区别在于连接的管理方式和性能方面。

(1)createPool:

  • createPool 方法创建了一个连接池,连接池会在需要时创建多个连接,并在不需要时将连接放回池中,以便重复使用。这种方式适用于大量并发请求的情况,因为它可以有效地管理连接,避免了频繁地创建和销毁连接的开销。
  • 连接池的大小通常可以配置,以控制同时打开的连接数量,以防止数据库过载。这样可以确保在高负载时系统仍然能够保持稳定。
  • 使用连接池时,通过从池中获取连接来执行查询操作,执行完毕后将连接释放回池中,这样可以最大程度地重用连接,提高性能和效率。

示例代码:


const mysql = require('mysql');
const pool = mysql.createPool({
  connectionLimit: 10, // 最大连接数
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'my_database'
});
pool.getConnection((err, connection) => {
  if (err) throw err;
  connection.query('SELECT * FROM my_table', (error, results, fields) => {
    connection.release(); // 释放连接
    if (error) throw error;
    console.log(results);
  });
});

(2)createConnection:


- `createConnection` 方法每次调用都会创建一个新的数据库连接。这种方式适用于低负载的场景或者在单个请求中只需要少量查询的情况。
- 每次调用`createConnection`都会创建一个新的连接,执行完毕后需要手动关闭连接,否则会造成资源浪费和内存泄漏。

示例代码:


const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'my_database'
});

connection.connect((err) => {
  if (err) throw err;
  console.log('Connected to MySQL database');
  connection.query('SELECT * FROM my_table', (error, results, fields) => {
    if (error) throw error;
    console.log(results);
    connection.end(); // 关闭连接
  });
});

总的来说,createPool适用于高并发的情况,可以有效地管理连接,提高性能和可靠性,而createConnection适用于低负载的场景或者简单的应用中。

2、数据库高并发createPool

之前我们采用的都是这种createConnection方式,之前我们讲了createConnection和createPool的区别和联系,接下来我们也采用createPool这种更加高效的方式进行连接,接下来我们就使用这种方式优化我们的数据库接口。

之前我们连接数据库采用的这种方式:


// 创建数据库链接(非高并发的方式)
const mysql = require('mysql');
const connection = mysql.createConnection({
    host: 'localhost', // 数据库主机地址,如果是本地数据库则使用localhost
    user: 'root', // 数据库用户名
    password: 'xxxxx', // 数据库密码
    database: 'nexus', // 要连接的数据库名
});
module.exports = connection;

现在我们更改为高并发createPool方式,总得来说只需要把connection更改为createPool方式即可

(1)查询createPool方式


 app.get('/api/user', (req, res) => {
 const { name, age,sex } = req.query;
 const values =[name, age,sex];
 let query = 'SELECT * FROM user';
 // 构建查询条件
 const params = [];
 if (name !== undefined&&name !== ''&&name !== null) {
   query += ' WHERE name = ?';
   params.push(name);
 }
 if (age !== undefined&&age !== ''&&age !== null) {
   query += params.length ? ' AND' : ' WHERE';
   query += ' age = ?';
   params.push(age);
 }

 // 查询数据库并返回数据
 connectionpool.query(query,params,(err, results) => {
   if (err) {
     console.error('Error querying database:', err);
     res.status(500).json({ error: 'Internal server error' });
     return;
   }
   res.json({
     code:'200',
     data:results,
   });
 });
});

(2)新增用户连接池方式

post新增用户


// 新增用户 POST 请求处理程序 
app.post('/api/user', (req, res) => {
 const { name, age } = req.body; // 从请求体中获取数据
 const values = [name, age];
 const insertSql = `INSERT INTO user (name, age) VALUES (?, ?)`;
 connectionpool.query(insertSql, values, (err, results) => {
   if (err) {
     console.error('Error querying database:', err);
     res.status(500).json({ error: 'Internal server error' });
     return;
   }
   res.json({
     code:'200',
     data:results,
   });
 });
});

(3)用户详情连接池方式


// 获取用户详情 3
app.get('/api/user/:id', (req, res) => {

 const { id } = req.params;
 const values =[id];
 let query = 'SELECT * FROM user WHERE id = ?';
 connectionpool.query(query,values,(err, results) => {
   if (err) {
     console.error('Error querying database:', err);
     res.status(500).json({ error: 'Internal server error' });
     return;
   }
   res.json({
     code:'200',
     data:results?results[0]:{},
   });
 });
});

(4)put修改连接池方式


 app.put('/api/user', (req, res) => {
 // console.log(req.body);
 const { name, age ,id} = req.body; // 从请求体中获取数据
 const values = [name, age, id];
 // 准备 SQL 插入语句
 const sql = "UPDATE user SET name = ?, age = ? WHERE id = ?";
 connectionpool.query(sql, values, (err, results) => {
   // console.log(err,'err');
   // console.log(results,'results');
   if (err) {
     console.error('Error querying database:', err);
     res.status(500).json({ error: 'Internal server error' });
     return;
   }
   res.json({
     code:'200',
     data:results,
   });
 });
});

(5)删除用户连接池方式


 // 删除用户数据 DELETE请求处理程序  
app.delete('/api/user/:id', (req, res) => {
 // const {id} = req.body; // 从请求体中获取数据
 const id = req.params.id;
 // console.log(id,'id');
 const values = [id];
 const sql = "DELETE FROM user WHERE id = ?";
 connectionpool.query(sql, values, (err, results) => {
   // console.log(err,'err');
   // console.log(results,'results');
   if (err) {
     console.error('Error querying database:', err);
     res.status(500).json({ error: 'Internal server error' });
     return;
   }
   res.json({
     code:'200',
     data:results,
   });
 });
});

最后测试一下我们的增删改查以及我们的查询条件,没问题。高并发createPool方式更改ok!

(6)优化多进程

优化一下,接口里面允许同一个时间查询多个接口


multipleStatements: true, //  允许执行多条语句

// 创建数据库连接池 createPool(高并发方式)
const connectionpool = mysql.createPool({
   host: 'localhost', // 数据库主机地址,如果是本地数据库则使用localhost
   user: 'root', // 数据库用户名
   password: '', // 数据库密码
   database: '' // 要连接的数据库名
   multipleStatements: true, //  允许执行多条语句
});
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。