一 .什么是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运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...
随机推荐
- stdc++.6.0.9动态库缺失
问题 ld: library not found for -lstdc++.6.0.9 clang: error: linker command failed with exit code 1 (us ...
- 编译原理之DFA最小化,语法分析初步
1.将DFA最小化: 状态转换图: 识别语言:b*ac*(da)*bb* 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 (1)正规式: S -> 0(1S+ ...
- unittest---unittest跳过用例
我们在做自动化测试的时候,可能会遇到一些用例中间不用回归,想要进行跳过.直接注释的话,代码量修改过大,显然这个方法不妥,哪还有什么方法?unittest这个自动化框架可以帮助我们完成这个操作 自动跳过 ...
- 【测试基础】App测试要点总结
测试工作过程中思维过程:测试人员常被看作Bug寻找者,程序的破坏者. 1.好的测试工程师所具备的能力: 细心的观察能力 有效的提问能力 产品的业务能力 好奇心 2.测试人员需要询问问题:测试人员的核心 ...
- 【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
题意: 给定\(n\)个点,一个图的价值定义为所有点的度数的\(k\)次方之和. 现在计算所有\(n\)个点的简单无向图的价值之和. 思路: 将式子列出来: \[ \sum_{i=1}^n\sum_{ ...
- java之对象类型转换
基本数据类型之间的转换: 自动类型转换:小的数据类型可以自动转换成大的数据类型: 强制类型转换:可以把大的数据类型转换成小的数据类型:float = (float)32.0; public class ...
- Appium+Java 自动化测试系列二:Maven+Testng
新建Maven项目作为测试项目分为3个步骤: 1.Eclipse安装Testng 插件 2.新建Maven项目 3.引入Testng 一.Eclipse安装Testng插件 TestNG安装可选择在线 ...
- 解决“var/log/sysstat/sa21: 没有那个文件或目录 请检查是否允许数据收集”
想使用sar查看一些系统的一些活动信息,发现报错.记录一下 使用apt install sysstat后第一次 报错 /var/log/sysstat/sa21: 没有那个文件或目录 请检查是否允许数 ...
- 手把手教你搭建织女星开发板RISC-V开发环境
前言 Windows环境下搭建基于Eclipse + RISC-V gcc编译器的RISC-V开发环境,配合openocd调试软件,可以实现RISC-V内核程序的编译.下载和调试. 准备工作 工欲善其 ...
- ASP.NET图片上传和截取
一.介绍:图片的上传直接使用ajax就可以了,截取图片的话使用到Jcrop插件. 图片上传资料:https://www.jb51.net/article/87654.htm 截取图片插件:http:/ ...