记录使用mysql2中createConnection和createPool的区别

文章目录

  • 前言
  • config
  • 一、`createConnection`使用
  • 二、`createPool`
  • 总结
    • `如有启发,可点赞收藏哟~`


前言

查看mysql2源码可以看到连接数据库有两种方法,一种是createConnection,另一种是createPool
为啥不只提供一种链接方式呢?

  • 在开发web应用程序时,连接池是一个很重要的概念。建立一个数据库连接所消耗的性能成本是很高的。在服务器应用程序中,如果为每一个接收到的客户端请求都建立一个或多个数据库连接,将严重降低应用程序性能。

  • 因此在服务器应用程序中通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,从连接池中取出连接并重新利用,而不需要再重新建立连接。

  • 所以既有createConnection创建数据库连接、createPool创建数据库池和createPoolCluster创建数据库池群几种方式连接数据库

咱主要介绍createConnectioncreatePool

在这里插入图片描述


config

import { PoolOptions } from "mysql2";

export const config = {
    DATABASE: 'admin_auth', //数据库名称
    USERNAME: 'root', //mysql用户名
    PASSWORD: 'Niceshot123@@@@', //mysql密码
    PORT: 3306, //mysql端口号
    HOST: 'localhost' //服务器ip
}

export const mysqlAccess: PoolOptions = {
    host: config.HOST,
    user: config.USERNAME,
    password: config.PASSWORD,
    database: config.DATABASE,
    port: config.PORT,
    rowsAsArray: false, // 实际设置为true都是返回数组格式
    multipleStatements: false // 实际设置为true都是可以操作多条数据
};

一、createConnection使用

  • 定义
import mysql, { Connection, ConnectionOptions, ResultSetHeader, RowDataPacket} from 'mysql2/promise';

export class MySQLConnection {
    // 连接
    private conn: Connection | null;
    // 连接选项
    private credentials: ConnectionOptions;

    constructor(credentials: ConnectionOptions) {
        this.credentials = credentials;
        this.conn = null
        mysql.createConnection(this.credentials).then((conn) => {
            this.conn = conn
        });
    }
    /** 调用方法前判断断开连接需再次执行链接 */
    private async ensureConnection() {
        if (!this?.conn) this.conn = await mysql.createConnection(this.credentials);
    }

    /** 对于`SELECT` and `SHOW`语句,返回对象数据 */
    public queryRows = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.query.bind(this.conn)<ResultSetHeader>(sql);
    }
    
    
    /** 对于`SELECT` and `SHOW`语句,返回数组数据(rowsAsArray需设置为true) */
    public queryRowsAsArray = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.query.bind(this.conn)<RowDataPacket[][]>(sql);
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作单条) */
    public queryResult = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.query.bind(this.conn)<ResultSetHeader>(sql);
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作多条)(multipleStatements需设置为true) */
    public queryResults = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.query.bind(this.conn)<ResultSetHeader[]>(sql);
    }
    
    /** 对于`SELECT` and `SHOW`语句,返回对象数据 */
    public executeRows = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.execute.bind(this.conn)<RowDataPacket[]>(sql);
    }

    /** 对于`SELECT` and `SHOW`语句,返回数组数据(rowsAsArray需设置为true) */
    public executeRowsAsArray = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.execute.bind(this.conn)<RowDataPacket[][]>(sql);
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作单条) */
    public executeResult = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.execute.bind(this.conn)<ResultSetHeader>(sql);
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作多条)(multipleStatements需设置为true) */
    public executeResults = async (sql: string) => {
        await this.ensureConnection();
        if(!this.conn) return []
        return await this.conn.execute.bind(this.conn)<ResultSetHeader[]>(sql);
    }
}
  • 使用
import { MySQLConnection } from '../data-base/connection';
const connection = new MySQLConnection(mysqlAccess)

router.post('/login', async(ctx: Koa.Context) => {
  const { body } = ctx.request
  const { userName, passWord } = body as User
  const sql = `select * from user where user_name = '${userName}' and pass_word = '${passWord}'`
  const [result] = await connection.executeRowsAsArray(sql);
  let resultData = {}
  if(result instanceof Array) {
    resultData = result[0]
  }
  ctx.body= {
      code:'200',
      data: resultData,
      msg:'登录成功',
  }
})

二、createPool

  • 定义
import { Pool, PoolOptions, ResultSetHeader, RowDataPacket, createPool } from 'mysql2/promise';

export class MySQLPool {
    // 连接池
    private conn: Pool;
    // 连接池选项
    private credentials: PoolOptions;

    constructor(credentials: PoolOptions) {
        this.credentials = credentials;
        this.conn = createPool(this.credentials);
    }

    /** 调用方法前判断断开连接需再次执行链接 */
    private ensureConnection() {
        if (!this?.conn) this.conn = createPool(this.credentials);
    }

    /** 对于`SELECT` and `SHOW`语句,返回对象数据 */
    get queryRows() {
        this.ensureConnection();
        return this.conn.query.bind(this.conn)<RowDataPacket[]>;
    }

    /** 对于`SELECT` and `SHOW`语句,返回数组数据 */
    get queryRowsAsArray() {
        this.ensureConnection();
        return this.conn.query.bind(this.conn)<RowDataPacket[][]>;
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作单条) */
    get queryResult() {
        this.ensureConnection();
        return this.conn.query.bind(this.conn)<ResultSetHeader>
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作多条)(multipleStatements需设置为true) */
    get queryResults() {
        this.ensureConnection();
        return this.conn.execute.bind(this.conn)<ResultSetHeader[]>
    }
    
    /** 对于`SELECT` and `SHOW`语句,返回对象数据 */
    get executeRows() {
        this.ensureConnection();
        return this.conn.execute.bind(this.conn)<RowDataPacket[]>;
    }

    /** 对于`SELECT` and `SHOW`语句,返回数组数据 */
    get executeRowsAsArray() {
        this.ensureConnection();
        return this.conn.execute.bind(this.conn)<RowDataPacket[][]>;
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作单条) */
    get executeResult() {
        this.ensureConnection();
        return this.conn.execute.bind(this.conn)<ResultSetHeader>
    }

    /** 对于`INSERT`, `UPDATE`等更改数据的语句(操作多条)(multipleStatements需设置为true) */
    get executeResults() {
        this.ensureConnection();
        return this.conn.execute.bind(this.conn)<ResultSetHeader[]>
    }
}
  • 使用
import { MySQLPool } from '../data-base/pool';
const pool = new MySQLPool(mysqlAccess);

router.post('/login2', async(ctx: Koa.Context) => {
  const { body } = ctx.request
  const { userName, passWord } = body as User
  const sql = `select * from user where user_name = '${userName}' and pass_word = '${passWord}'`
  const [result] = await pool.queryRows(sql);
  let resultData = {}
  if(result instanceof Array) {
    resultData = result[0]
  }
  ctx.body= {
      code:'200',
      data: resultData,
      msg:'登录成功',
  }
})

总结

如有启发,可点赞收藏哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件搜索项目知识介绍

项目背景SQLite介绍SQLite、驱动包下载SQLite使用SQLite和MySQL区别 JDBC搭配SQLiteJDBC原理-创建连接JDBC原理-关闭连接添加和发送SQLJDBC-事务开启和提交 打包.exe文件线程池线程数量问题 项目背景 需求上&#xff1a;因为Windows的文件搜索工具搜索速度十分的慢&#xff1b…

编程实战:自己编写HTTP服务器(系列6:调用用户功能)

系列入口&#xff1a;编程实战&#xff1a;自己编写HTTP服务器&#xff08;系列1&#xff1a;概述和应答&#xff09;-CSDN博客 本文讲解如何将原有C代码接入到WEB服务里。 目录 一、概述 二、框架入口 三、执行用户功能 3.1 代码 3.2 入口参数 3.3 系统检查和初始化 3…

消息队列kafka详解:Kafka重要知识点+面试题大全

重要面试知识点 Kafka 消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费。这句话改怎么理解呢&#xff1f; 在同一个消费者组内&#xff0c;一个 Partition 只能被一个消费者消费。 在同一个消费者组内&#xff0c;所有消费者组合起来必定可以消费一个 Topic 下…

【flutter对抗】blutter使用+ACTF习题

最新的能很好反编译flutter程序的项目 1、安装 git clone https://github.com/worawit/blutter --depth1​ 然后我直接将对应的两个压缩包下载下来&#xff08;通过浏览器手动下载&#xff09; 不再通过python的代码来下载&#xff0c;之前一直卡在这个地方。 如果读者可以…

npm安装

node 设置配置之后&#xff0c;要查询时&#xff0c;会从.npmrc中读取路径 .npmrc自己创建的&#xff08;默认情况下.npmrc会创建在C盘中&#xff09; 自己创建的在D:\studay-and-working\node16.14\node_modules\npm中 指定.npmrc文件&#xff0c;因为默认会访问C盘的.npmrc文…

在Windows系统和Linux系统中MongoDB的安装方法

本文主要介绍在Windows系统和Linux系统中MongoDB的安装方法。 目录 Windows系统中安装MongoDBLinux系统中安装MongoDB Windows系统中安装MongoDB 在Windows系统中安装MongoDB&#xff0c;可以分为以下几个步骤&#xff1a; 下载MongoDB安装包 在MongoDB官网上下载Windows系统下…

【Linux学习】深入理解动态库与静态库

目录 十三.动态库与静态库 13.1 认识动静态库 13.2 深入理解动静态库 什么是库? 编译链接过程 动静态库的基本原理 13.3 静态库 静态库的打包: 静态库的使用: 13.4 动态库 动态库的打包: 动态库的使用: 13.5 动态库与静态库怎么选? 十三.动态库与静态库 13.1 认识动静态库 …

Vue 中 v-model 的修饰符

lazy 修饰符&#xff1a;将 v-model 改为失去焦点后更新数据。 number 修饰符&#xff1a;将 v-model 数据转为数字类型。 trim 修饰符&#xff1a;去除 v-model 数据中的首尾空格。 语法格式&#xff1a; // lazy 修饰符 <input v-model.lazy"数据"> // nu…

ArcGIS pro与SuperMap根据属性自动填充颜色步骤

GIS项目经常会接触到控规CAD数据&#xff0c;想要把数据转换成GIS图层并发布&#xff0c;需要进行专题配图。研究了一下ArcGIS pro和SuperMap iDesktop的配图&#xff0c;整理一下用到的一些技术思路。 1、Excel表格根据RGB值添加单元格填充颜色 要实现如上效果图&#xff0c;…

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、龙辰辰事件概述二、为什么龙辰辰会被质疑AI创作&#xff1f;1.1 AI 作画的特点2.2 关于建行的合作宣传图…

如何利用宝塔面板和docker快速部署网站

当你有了一台服务器&#xff0c;就会折腾往这台服务器上部署各种好玩的网站。市面上有许多开源的网站项目&#xff0c;通过docker技术可以快速部署并使用&#xff0c;本文将以部署filebrowser举例介绍网站部署的基本流程。 1. 安装宝塔面板 宝塔面板是一款开源的网站运维工具…

博客内容和多种搜索友好格式在 2024 年的作用

内容和SEO之间一直存在着密切的联系。 今天&#xff0c;我想分享一些关于博客、内容和搜索友好格式的想法和技巧。此外&#xff0c;我将分享有关生成式人工智能如何为这种关系添加新元素的见解。 谷歌最近关于有用和有价值的内容的更新重新引发了关于如何找到内容以及内容排名…

汽车销售技巧培训应该学习哪些内容

汽车销售技巧培训应该学习哪些内容 随着汽车市场的竞争日益激烈&#xff0c;汽车销售技巧培训对于提高销售人员的销售能力和服务水平至关重要。本文将介绍汽车销售技巧培训应该学习哪些内容&#xff0c;并结合案例进行分析。 一、产品知识 作为销售人员&#xff0c;了解所销售…

用户管理第2节课 -- idea 2023.2 创建表

一、懂得 1.1编码格式是防止乱码的&#xff0c;utf-8是完全够的&#xff0c;那几个基本没差别 网址&#xff1a; 【IDEA——连接MySQL数据库&#xff0c;创建库和表】_idea中数据库-CSDN博客 这些是MySQL数据库中的一些术语&#xff0c;可以简单解释如下&#xff1a; 1、col…

【日积月累】Spring中的AOP与IOC相关问题详解

Spring中的AOP与IOC 1.前言2.Spring AOP&#xff08;面向切面编程&#xff09;2.1 AOP的实现过程2.2 AOP代理模式的类型2.2.1JDK的动态代理2.2.2CGLIB的动态代理 2.3AOP应用常见场景2.3.1日志记录 2.4对AOP的理解 3.Spring IOC&#xff08;Inversion of Control&#xff0c;控…

低代码平台解密:探秘MQTT协议的应用之道

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 低代码平台作为当今快速发展的技术之一&#xff0c;为开发人员提供了更高效、更简便的工具和方法&#xff0c;以…

深度解读 Cascades 查询优化器

数据库中查询优化器是数据库的核心组件&#xff0c;其决定着 SQL 查询的性能。Cascades 优化器是 Goetz 在 volcano optimizer generator 的基础上优化之后诞生的一个搜索框架。 本期技术贴将带大家了解 Cascades 查询优化器。首先介绍 SQL 查询优化器&#xff0c;接着分析查询…

【玩转TableAgent数据智能分析】TableAgent全功能详解及多领域数据分析实践(下)数据分析过程及总结展望

6 TableAgent的数据分析过程解析 TableAgent的整个分析过程包括以下步骤&#xff0c;形成一个有机结构&#xff0c;让我们理清其工作原理。 6.1 Data Graph阶段 TableAgent首先绘制数据图&#xff0c;以解决问题。这个图形表示了问题的分解和细化&#xff0c;将大问题分解成…

git强制回滚,远程强制更新,git pull强制更新

注意&#xff1a;这里是强制回滚&#xff0c;回滚后&#xff0c;之后历史的就没有了&#xff0c;慎用。 本地强制回滚 强制回滚到上一个版本 git reset --hard HEAD^强制回滚上上个版本 git reset --hard HEAD^^git log查看版本 git log --prettyonelinegit log --prettyf…

【网络安全】HTTP Slowloris攻击原理解析

文章目录 Slowloris攻击的概念Slowloris攻击原理Slowloris攻击的步骤其他的DDoS攻击类型UDP FloodICMP (Ping) FloodSYN FloodPing of DeathNTP AmplificationHTTP FloodZero-day DDoS 攻击 推荐阅读 Slowloris攻击的概念 Slowloris是在2009年由著名Web安全专家RSnake提出的一…