1. 什么是数据库连接池?

数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放。

2. 使用数据库连接池原理及优点是什么?

数据库连接池在初始化时将会创建一定数量的数据库连接放到连接池中,连接池都将一直保证至少拥有这么多的连接数量,当有数据库需要被连接的时候,它会向数据库连接池申请资源和使用,使用完成后会释放到数据库连接池中。当然数据库连接池中拥有最小连接数量和最大连接数量,当数据库的连接超过连接池中最大的数量的时候,这些请求将被加入到等待队列中。

其实他们的原理就好比我们公司的招聘前端开发一样,当有A项目的时候,我们公司需要招聘一个前端开发去做项目,但是当公司有B、C、D、等项目的时候,或者很多项目的时候需要不断的招聘前端开发,那么这样会给公司带来很多人力成本的。因此我们需要一个前端主管来管理这些前端资源。前端主管手下假如有5个前端开发,那么当A、B、C、D、E、项目来的时候,前端主管会依次把这些项目分配给对应的开发人员去跟进。但是当还有F等项目的时候,因为F项目已经超过前端人员的时候,没有人再去支持这些个项目,因此这些项目需要排期,等A、B、C、D、E 其中任何一个开发完成后,上线了,然后这些开发人员就和数据库一样释放资源,返回到前端组来,然后前端主管再把F项目分配到对应的开发人员。这个比方就好比可以理解为一个数据库连接池了。而不是有n个项目需要招聘n个前端开发来做项目,那这样的缺点是公司的人力成本会大大的增加。所以数据库的链接池也是这个意思,当网站某一天有很大的流量的时候,数据库服务器需要为每次链接创建一次数据库链接。这样就很浪费数据库的资源,并且频繁的创建和关闭数据库的链接,很容易导致服务器内存溢出等情况发生。

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

3. 传统的数据库链接和数据库连接池的运行机制有啥区别?

传统的我们一般来java来说:java访问数据库的过程一般是如下:

1. 装载数据库驱动程序。
2. 通过JDBC建立数据库的链接。
3. 访问数据库,执行一些sql语句。
4. 断开及关闭数据库的链接。

如上是一般的java访问数据库链接的过程。

下面我们使用数据库的连接池的操作过程如下:

1. 程序初始化时创建连接池。
2. 使用时向连接池申请可用的资源。
3. 使用完毕后,将数据库链接返回给连接池。
4. 程序退出时,断开所有的链接,并释放数据库的链接。

这就是传统和连接池的区别。

node + mysql 实现数据库连接池

在mysql模块中,我们可以使用 createPool方法来创建连接池,使用方法如下所示:

var pool = mysql.createPool(options);

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

connectionLimit: 用于指定连接池中最大的链接数,默认属性值为10.

queueLimit: 用于指定允许挂起的最大连接数,如果挂起的连接数超过该数值,就会立即抛出一个错误,默认属性值为0.代表不允许被挂起的最大连接数。

在如上建立连接后,我们可以使用 getConnection 方法从连接池中获取一个连接。该方法使用如下所示:

pool.getConnection(callback);

getConnection 方法调用后,它有一个参数callback回调函数,该回调函数也有二个参数,如下所示:

function(err, connection) {

}

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

当连接不需要使用的时候,我们可以使用该连接对象的 release 方法来归还到连接池中。该方法使用如下:

connection.release();

当连接不需要使用且需要从连接池中移除的时候,我们可以使用destory方法,该方法使用如下所示:

connection.destory();

当连接不需要使用的时候,我们可以关闭该连接,使用方法如下:

pool.end();

下面我们来做一个使用数据库连接池做一个demo如下所示:

const mysql = require('mysql');
// 创建一个数据库连接池
const pool = mysql.createPool({
host: 'localhost',
port: 3306,
database: 'my_db',
user: 'root',
password: '123456'
});
// 从连接池中获取一个连接
pool.getConnection((err, conn) => {
if (err) {
console.log('和mysql数据库建立连接失败');
} else {
console.log('和mysql数据库连接成功');
conn.query('select * from user', (err2, res) => {
if (err2) {
console.log('查询数据库失败');
} else {
console.log(res);
pool.end();
}
})
}
});

如下图所示:

node+mysql 数据库连接池的更多相关文章

  1. 一个简单的MySql数据库连接池的实现

    package cn.hc.connectionPool; import java.io.IOException; import java.io.InputStream; import java.sq ...

  2. Python实现Mysql数据库连接池

    python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...

  3. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息

    1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...

  4. MySql数据库连接池专题

    MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html

  5. python3 实现mysql数据库连接池

    首先声明一下,这篇博客进行了通过自己的代码方式,加上这篇博客,最后总结出这段代码.参考博客连接:http://blog.csdn.net/zbc1090549839/article/details/5 ...

  6. MySql数据库连接池

    1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...

  7. mysql数据库连接池使用(二)实现自己的数据库连接池

    上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...

  8. mysql数据库连接池使用(一)dbcp方式的配置

    Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...

  9. Tomcat中配置MySQL数据库连接池

    Web开发中与数据库的连接是必不可少的,而数据库连接池技术很好的优化了动态页与数据库的连接,相比单个连接数据库连接池节省了很大的资源.用一个通俗的比喻:如果一个人洗澡需花一桶水,那一百个人就要花一百桶 ...

随机推荐

  1. spring框架应用系列二:component-scan自动扫描注册装配

    component-scan自动扫描注册装配 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7717331.html ...

  2. scrapy爬虫学习系列五:图片的抓取和下载

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  3. 阿里云ACE共创空间——MQ消息队列产品测试

    一.产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架构 ...

  4. javascript基础修炼(5)—Event Loop(Node.js)

    开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一. 一道考察异步知识的面试题 题目是这样的,要求写出下面代码的输出: setTimeout(() => { co ...

  5. 【转载】ASP.NET MVC重写URL制作伪静态网页,URL地址以.html结尾

    在搜索引擎优化领域,静态网页对于SEO的优化有着很大的好处,因此很多人就想把自己的网站的一些网页做成伪静态.我们现在在网络上发现很多博客网站.论坛网站.CMS内容管理系统等都有使用伪静态这一种情况,伪 ...

  6. Docker搭建MongoDB

    1. Docker搭建Mongodb 1.1 获取docker镜像 docker pull mongo 1.2 创建mongodb容器 docker run --name my-mongo -p 27 ...

  7. [MySQL] mysql int后面的数字与前导零填充

    1.int或者tinyint等数值型字段的存储范围已经是固定的,和类型相关2.后面的数字只与显示有关,并且是在开启了zerofill前导零填充的前提下 3.显示的时候,在前面用0补全了 create ...

  8. Java开发笔记(三十二)字符型与整型相互转化

    前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...

  9. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  10. Serialization

    title: Serialization date: 2018-03-26 15:18:26 tags: [JAVA,Read] categories: other --- 概述 程序运行时,变量的内 ...