❤Node06-数据库高并发createPool

❤Node06-数据库高并发createPool

1、 mysql模块的认识

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

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

(1) createPool:

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

示例代码:

js

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:

js

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

示例代码:

js

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方式

js

 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方法更改为我们的连接池方式

js

 
// 新增用户 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)获取用户详情

js

 // 获取用户详情 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修改方法的更改

js

js

 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方法的更改

js

 // 删除用户数据 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)优化多进程

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

js

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

// 创建数据库连接池 createPool(高并发方式)
const connectionpool = mysql.createPool({
   host: 'localhost', // 数据库主机地址,如果是本地数据库则使用localhost
   user: 'root', // 数据库用户名
   password: '', // 数据库密码
   database: '' // 要连接的数据库名
   multipleStatements: true, //  允许执行多条语句
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林太白

感谢打赏,你拥有了我VIP权限

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值