Node+MySQL 实现数据库连接池

一、使用mysql模块操作MYSQL数据库

1、下载mysql模块

npm install mysql

2、配置mysql 模块

在使用mysql数据库之前,必须先对mysql模块进行必要的配置,主要配置步骤:

//导入mysql模块
const mysql = require('mysql');
//创建数据库连接池
const pool = mysql.createPool({
    host:'localhost',   //数据库的ip地址
    port:3306,
    user:'root',
    password:'123456',
    databases:'dbms'    //指定操作的数据库
    })

3、测试mysql模块能否正常工作

调用db.query()函数,指定要执行的SQL语句,通过回调函数拿到执行的结果:

db.query('select 1',(err,results)=>{
    //mysql 模块工作期间报错
    if(err)return console.log(err.message);
    //成功执行MYSQL代码
    console.log(results);
})

测试结果如下:
在这里插入图片描述

4、查询数据

我的数据库中的数据是
在这里插入图片描述

调用db.query()函数,查询star中的数据

const sqlStr = 'select * from star';
db.query(sqlStr,(err,results)=>{
    //查询数据失败
    if(err) 
         return console.log(err.message);
    //查询数据成功
    console.log(results);
})

得到的查询结果:
在这里插入图片描述

5、插入数据

要插入到stars 表中的数据对象 [name:杨幂,age:30,sex:‘女’]

//要插入到 star 表中的数据对象
const star = {name:'杨幂',age:'30',sex:'女'}
//定义待执行的SQL语句,?作为占位符
const sqlStr = 'insert into stars (name,age,sex) values(?,?,?)'
//执行SQL语句
db.query(sqlStr,[star.name,star.age,star.sex],(err,results)=>{
    //执行插入失败
    if(err) return console.log(err.message);
    //成功了
    if(results.affectedRows === 1){
        console.log('插入数据成功');
    }
})

注意:如果执行的是insert into 插入语句,则results 是一个对象,可以通过 affectedRows 属性,来判断是否插入数据成功。

打开stars表,可以得到插入数据

在这里插入图片描述
插入数据的便捷方式
如果我们希望数据对象的每个属性和数据表的字段一一对应,则可以通过下面这个方法快速插入数据:

// 要插入到 star 表中的数据对象
const star = {name:'杨幂',age:'30',sex:'女'}
//定义待执行的SQL语句
const sqlStr = 'insert into stars set ?'    //只需要加上" set ?  "
//执行SQL语句
db.query(sqlStr,star,(err,results)=>{
    //执行插入失败
    if(err) return console.log(err.message);
    //成功了
    if(results.affectedRows === 1){
        console.log('插入数据成功');
    }
})

6、更新数据

//1.更新的数据对象
const star = {id:2,name:'杨颖',age:29,sex:'女'}
//定义待执行的SQL语句
const sqlStr = 'update stars set name=?,age=?,sex=? where id=?'
//执行SQL语句
db.query(sqlStr,[star.name,star.age,star.sex],(err,results)=>{
    if(err) return console.log(err.message);
    if(results.affectedRows === 1){
        console.log('更新成功');
    }
})

注意:执行update语句之后,执行的结果也是一个对象,可以通过 affectedRows 判断是否更新成功

更新数据的便捷方式

const star = {id:2,name:'杨颖',age:29,sex:'女'}
//定义待执行的SQL语句
const sqlStr = 'update stars set? where id=?'
//执行SQL语句
db.query(sqlStr,[star,star.id],(err,results)=>{
    if(err) return console.log(err.message);
    if(results.affectedRows === 1){
        console.log('更新成功');
    }
})

更新结果如下
在这里插入图片描述

7、删除数据

根据id这样的唯一标识,来删除对应的数据

// An highlighted block
var foo = 'bar';//定义待执行的SQL语句
const sqlStr = 'delete from  stars where id=?'
//执行SQL语句
db.query(sqlStr,6,(err,results)=>{
    if(err) return console.log(err.message);
    if(results.affectedRows === 1){
        console.log('删除成功');
    }
})

测试结果可见id为6 的数据删除成功

在这里插入图片描述

注意:执行update语句之后,执行的结果也是一个对象,可以通过 affectedRows 判断是否更新成功

8、标记删除

使用delete 语句,会把真正的数据从表中删除,为了保险起见,可以使用标记删除的形式,来模拟删除的动作。
所谓的标记删除,就是在表中设置类似于status这样的状态字段,来标记当前数据是否被删除.
当用户执行了删除的动作时,我们并没有执行delete 语句把数据删除掉,而是执行了 update 语句,将这条数据对应的 status 字段标记为删除即可。

const sqlStr = 'update  stars set status=?  where id=?'
//执行SQL语句
db.query(sqlStr,[1,5],(err,results)=>{
    if(err) return console.log(err.message);
    if(results.affectedRows === 1){
        console.log('标记删除成功');
    }
})

在这里插入图片描述
标记删除成功

二、数据库连接池?

1、应用程序直接获取数据库连接的缺点

用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。如下图所示:
 在这里插入图片描述

2、数据库连接池概念

数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,由程序动态地对池中的连接对象进行申请、使用和释放。数据库连接池在初始化时将会创建一定数量的数据库连接对象放到连接池中,连接池都将一直保证至少拥有这么多的连接数量,当有数据库需要被连接的时候,它会向数据库连接池申请资源和使用,使用完成后会释放到数据库连接池中。当然数据库连接池中拥有最小连接数量和最大连接数量,当数据库的连接超过连接池中最大的数量的时候,这些请求将被加入到等待队列中。
在这里插入图片描述

3、连接池的作用是什么?

数据库的连接池负责分配、管理和释放数据库连接对象的。它允许应用程序重复使用一个现有的数据库的连接对象。而不是重新创建一个。

4、Node + MySQL 实现数据库连接池

1、创建连接池

 	var pool = mysql.createPool(options);

options 参数是一个对象,该对象中有很多属性配置,该对象的作用是用于指定该连接池中连接统一使用的各种选项。

常见的选项如下:

  • connectionLimit:用于指定连接池中最大的链接数,默认属性值为10.
  • queueLimit:用于指定允许挂起的最大连接数,如果挂起的连接数超过该数值,就会立即抛出一个错误,默认属性值为0.代表不允许被挂起的最大连接数。
  • multipleStatements :是否允许执行多条sql语句,默认值为false
  • host:数据库服务器的地址
  • user:连接数据库的用户名
  • password:连接数据库的密码
  • database:数据库名
    连接池的框架:
const mysql = require('mysql');
//创建数据库连接池
const pool = mysql.createPool({
    connectionLimit:20,
    host:'localhost',
    port:3306,
    user:'root',
    password:'123456',
    databases:'dbms'
})
//将数据库连接池对象导出
module.exports = pool;

2、从连接池中获取一个连接
在 mysql模块中,使用createPool()方法创建连接池,在建立了连接池之后,可以直接使用连接池对象的getConnection()方法从连接池中获取一个连接,如果连接池中没有可用连接,将隐式的建立一个数据库连接

pool.getConnection(function(err, connection) {
             //  代码;
}
);

err:该参数是指操作失败时的错误对象。
connection:该值为一个对象,代表获取到的连接对象。当连接失败时,该值为undefined。

3、connection 相关方法

connection.release()当一个连接不需要使用时,使用该方法将其归还到连接池中

connection.destroy() 当一个连接不需要使用且需要从连接池中移除时,可以使用该方法

pool.end()当一个连接池不需要使用时,可以使用该方法关闭连接池

注意:可以使用createPool方法的属性connectionLimit设置连接池中的最大连接数,默认为10

整体代码展示如下:

//创建并使用连接池对象  
var mysql = require('mysql');  
var pool = mysql.createPool({  
    host : 'localhost',  
    port : 3306,  
    database : 'test',  
    user : 'root',  
    password : ''     
})  
pool.getConnection(function(err,connection){  
    if(err){  
        console.log('与mysql数据库建立连接失败');  
    }else{  
        console.log('与mysql数据库建立连接成功');  
        connection.query('select * from admin',function(err,rows){  
            if(err){  
                console.log('查询数据失败');  
            }else{  
                console.log(rows);  
                pool.end();  
            }  
        })  
    }  
})  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值