什么是连接池?
- 我们的服务器有
- 应用服务器(apache、tomcat、node等)
- 数据库服务器(mysql)
- 应用服务器会与数据库服务器建立连接并获取数据
应用服务器与数据库服务器数据交互的模式:
- 模式一:(不建议使用)
- 建立连接,获取到数据后,断开连接
- 每次获取数据都建立断开,很消耗性能(不建议使用)
应用服务器 数据库服务器
------------- -------------
| | 建立请求连接 | |
| |------------------->| |
| |<-------------------| |
| | 获取到数据后断开 | |
| | | |
------------- --------------
- 模式二:连接池模式(建议使用)
- 有一个连接池,用于保持应用服务器和数据库服务器之间的链接。
- 举例:
- 一开始,应用服务器与数据库服务器之间有一个连接池,保持了3个连接,当应用服务器请求数据库服务器的时候,会占用连接池的一个资源,进行数据通信,用完之后再还回到连接池
- 假设,有100个请求同时发送到应用服务器,应用服务器需要去请求数据库服务器,那连接池里是不是需要100个通道?
- 不是的,这样数据库服务器会吃不消,我们在创建服务器的时候,可以用connectionLimit字段限制连接池中的资源个数。假设connectionLimit的值是10,那么每次处理请求是10个,剩余的需要排队处理。
应用服务器 连接池 数据库服务器
------------- ------ -------------
| | | | 始终保持链接 | |
| | | o |------------------->| |
| | | o |------------------->| |
| | | o |------------------->| |
| | | | | |
------------- ------ --------------
let mysql = require("mysql");
//创建连接,有并发连接数限制,返回一个连接池
const pool = mysql.createConnection({
connectionLimit:10,//并发连接数
host:'localhost',
user:'root',
password:'123456',
database:'cms'
})
//数据库操作,当然,也可以使用库Q或者库bluebird进行promisify后操作
pool.query('SELECT 1+1 AS sulution',(err,result,fields) => {
console.log(err,result,fields);
})