一 .什么是mysql连接池
场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机。
解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个并发就有顺序的共享这连接池中的200个连接。
这个连接池能够带来额外的性能提升,因为这个和mysql建立连接的这个过程消耗较大,使用连接池只需连接一次mysql。
连接池定义:永不断开,要求我们的这个程序是一个常驻内存的程序。数据库连接池(Connection pooling)是程序启
动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
二.小案例
查找用户表数据库最新注册的3个会员?
(1)小提示
show processlist #mysql查看连接数
(2)创建10个mysql连接示例代码
<?php
/**
* Created by PhpStorm.
* User: Luke
* Date: 2019/10/30
* Time: 14:12
*/
//编写mysql连接池,这个类只能被实例化一次(单例)
class MysqlConnectionPool
{
private static $instance;//单例对象
private $connection_num = 10;//连接数量
private $connection_obj = [];
//构造方法连接mysql,创建20mysql连接
private function __construct()
{
for($i=0;$i<$this->connection_num;$i++){
$dsn = "mysql:host=127.0.0.1;dbnane=swoole";
$this->connection_obj[] = new Pdo($dsn,'root','rootmysql123');
}
}
private function __clone()
{
// TODO: Implement __clone() method.
}
public static function getInstance()
{
if(is_null(self::$instance)){
self::$instance = new self();
}
}
}
MysqlConnectionPool::getInstance();
//创建swool的http服务器对象
$serv = new swoole_http_server('0.0.0.0',8000);
//当浏览器链接点这个http服务器的时候,向浏览器发送helloworld
$serv->on('request', function($request,$response){
//$request包含这个请求的所有信息,比如参数
//$response包含返回给浏览器的所有信息,比如helloworld
//(2.3)向浏览器发送helloworld
$response->end("hello world");
});
//启动http服务器
$serv->start();
(3)效果
(4)完善mysql连接池
<?php
/**
* Created by PhpStorm.
* User: Luke
* Date: 2019/10/30
* Time: 14:12
*/
//编写mysql连接池,这个类只能被实例化一次(单例)
class MysqlConnectionPool
{
private static $instance;//单例对象
private $connection_num = 20;//连接数量
private $connection_obj = [];
private $avil_connection_num = 20;//可用连接
//构造方法连接mysql,创建20mysql连接
private function __construct()
{
for($i=0;$i<$this->connection_num;$i++){
$dsn = "mysql:host=127.0.0.1;dbname=swoole";
$this->connection_obj[] = new Pdo($dsn,'root','rootmysql123');
}
}
private function __clone()
{
// TODO: Implement __clone() method.
}
public static function getInstance()
{
if(is_null(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
//执行sql操作
public function query($sql)
{
if($this->avil_connection_num==0){
throw new Exception("暂时没有可用的连接诶,请稍后");
}
//执行sql语句
$pdo = array_pop($this->connection_obj);
//可用连接数减1
$this->avil_connection_num --;
//使用从连接池中取出的mysql连接执行查询,并且把数据取成关联数组
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
//把mysql连接放回连接池,可用连接数+1
array_push($this->connection_obj,$pdo);
$this->avil_connection_num ++;
return $rows;
}
}
//创建swool的http服务器对象
$serv = new swoole_http_server('0.0.0.0',8000);
//当浏览器链接点这个http服务器的时候,向浏览器发送helloworld
$serv->on('request', function($request,$response){
//$request包含这个请求的所有信息,比如参数
//$response包含返回给浏览器的所有信息,比如helloworld
//向浏览器发送helloworld
$stop = false;
while (!$stop){
try{
$sql = "SELECT * FROM user ORDER BY id DESC LIMIT 5";
$rows = MysqlConnectionPool::getInstance()->query($sql);
$response->end(json_encode($rows));
$stop = true;
}catch (Exception $e){
usleep(100000);
}
}
});
//启动http服务器
$serv->start();
- JDBC创建mysql连接池代码
1.底层实现类(DBConnection) package JDBC.JDBCPool.MyJDBCPool; import java.sql.Connection; import java.sql. ...
- Swoole4-swoole创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...
- C# 基于创建一个mysql 连接池
创建一个连接池操作类 using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using Syste ...
- MySQL连接池
1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...
- mysql连接池的使用工具类代码示例
mysql连接池代码工具示例(scala): import java.sql.{Connection,PreparedStatement,ResultSet} import org.apache.co ...
- 实现一个协程版mysql连接池
实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康:基于swoole的chanel. 最近事情忙,心态也有点不积极.技术倒是没有落下,只是越来越不想写博客了.想到 ...
- python中实现mysql连接池
python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...
- workerman如何写mysql连接池
首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用1.减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间2.减少 ...
- nodejs + redis/mysql 连接池问题
nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...
随机推荐
- 011.Kubernetes二进制部署kube-scheduler
一 部署高可用kube-scheduler 1.1 高可用kube-scheduler介绍 本实验部署一个三实例 kube-scheduler 的集群,启动后将通过竞争选举机制产生一个 leader ...
- subprocess之check_out用法
在python3中使用subprocess的check_out方法时,因为该输出为byte类型,所以如果要查看具体的内容时需要进行转码,如果转码不对话,会影响内容输出的可读性,如下: #1,输出解码不 ...
- 桶排序(C语言)
#include <stdio.h> int main(void) { int arr[5]={2,5,1,3,3}; //定义需要排序的数组 int res[6]={0}; //初始化& ...
- 一个简单的WebServer,socket+threading
一个简单的WebServer import socket import threading body = '<h1> web server </h1>' response_pa ...
- centos安装jdk10
下载一个jdk10文件到linux : wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=ac ...
- 更改路由器的外网IP
此方法适用于通过路由器拨号上网的宽带,若宽带通过光猫拨号上网则需要将光猫改为桥接模式并在路由器中配置宽带账号和密码 测试环境: 路由器:TP-LINK TL-WDR7800千兆版 硬件版本:1.0 软 ...
- 线段树模板加模板题POJ3468
POJ - 3468 整理了个新的线段树的模板,暑期集训的时候学长给的模板,每个节点单单存了自己所要维护的内容,还是少了点.导致在写pushdown的时候,len我会有点难写.所以就整理个新的模板. ...
- java中窗口的打开与关闭
作为小白的我,今天学习了java中打开与关闭窗口的方法. 1.在java中创建一个窗口 import java.awt.*;import java.awt.event.*;public class L ...
- HTML51-清除浮动overflow、网易注册界面基本结构搭建
一.overflow:hidden;作用 (1)可以将超出标签范围的内容裁剪掉 (2)清除浮动 .box1{ background-color: red; /*border:1px white sol ...
- navicat的一些常用快捷键
Navicat可以支持连接多种数据库,使用上的功能也比较强大. 如果使用了IDEA内置的数据库工具(个人喜欢用这个)或是SQL Server官方的数据库管理工具的话,会发现使用上都存在区别,区别就主要 ...