首页 > 其他分享 >连接池(示例:GO)

连接池(示例:GO)

时间:2024-07-05 10:31:43浏览次数:25  
标签:nil err 示例 factory sql GO 连接 连接池

连接池(Connection Pool)是一种用于管理和复用数据库连接或其他资源连接的技术。
通过连接池,应用程序可以避免频繁创建和销毁连接,从而提高性能和资源利用效率。
连接池的主要目标是减少连接的创建和销毁开销,提供一个连接复用机制。

一、连接池的工作原理

  1. 初始化连接池:启动时,连接池会创建一定数量的连接,并将这些连接放入池中备用。
  2. 获取连接:当应用程序需要使用数据库时,从连接池中获取一个空闲连接。如果连接池中没有可用连接,应用程序可以选择等待连接释放或创建新连接(视配置而定)。
  3. 使用连接:应用程序使用获取的连接与数据库进行交互。
  4. 释放连接:使用完毕后,应用程序将连接返回到连接池,以便其他请求使用。
  5. 连接管理:连接池会定期检查连接的健康状况,关闭无效连接,并根据需要增加或减少连接数量。

二、连接池的优点

  1. 提高性能:复用连接避免了频繁的连接创建和销毁,降低了数据库的负载。
  2. 资源管理:连接池可以限制最大连接数,防止资源耗尽。
  3. 可靠性:通过健康检查和连接管理,可以提高系统的稳定性。

三、Go实现简单连接池

示例假设连接池用于管理数据库连接。

package main

import (
	"database/sql"
	"fmt"
	"log"
	"sync"
	"time"

	_ "github.com/go-sql-driver/mysql"
)

// ConnectionPool 连接池结构
type ConnectionPool struct {
	mu       sync.Mutex
	conns    chan *sql.DB
	factory  func() (*sql.DB, error)
	maxConns int
}

// NewConnectionPool 创建一个新的连接池
func NewConnectionPool(factory func() (*sql.DB, error), maxConns int) (*ConnectionPool, error) {
	conns := make(chan *sql.DB, maxConns)
	for i := 0; i < maxConns; i++ {
		conn, err := factory()
		if err != nil {
			return nil, err
		}
		conns <- conn
	}
	return &ConnectionPool{
		conns:    conns,
		factory:  factory,
		maxConns: maxConns,
	}, nil
}

// Get 获取一个连接
func (p *ConnectionPool) Get() (*sql.DB, error) {
	p.mu.Lock()
	defer p.mu.Unlock()

	select {
	case conn := <-p.conns:
		return conn, nil
	default:
		return p.factory()
	}
}

// Release 释放一个连接
func (p *ConnectionPool) Release(conn *sql.DB) {
	p.mu.Lock()
	defer p.mu.Unlock()

	select {
	case p.conns <- conn:
	default:
		conn.Close()
	}
}

func main() {
	// 数据库连接工厂函数
	factory := func() (*sql.DB, error) {
		return sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
	}

	// 创建连接池
	pool, err := NewConnectionPool(factory, 5)
	if err != nil {
		log.Fatalf("Error creating connection pool: %v", err)
	}

	// 获取连接
	conn, err := pool.Get()
	if err != nil {
		log.Fatalf("Error getting connection: %v", err)
	}

	// 使用连接
	rows, err := conn.Query("SELECT id, name FROM users")
	if err != nil {
		log.Fatalf("Error querying database: %v", err)
	}
	defer rows.Close()

	for rows.Next() {
		var id int
		var name string
		if err := rows.Scan(&id, &name); err != nil {
			log.Fatalf("Error scanning row: %v", err)
		}
		fmt.Printf("User: %d, %s\n", id, name)
	}

	// 释放连接
	pool.Release(conn)
}

四、代码解释

  1. ConnectionPool 结构:定义了一个连接池结构,包含一个互斥锁、连接通道、工厂函数和最大连接数。
  2. NewConnectionPool 函数:创建并初始化连接池。
  3. Get 方法:从连接池中获取一个连接,如果没有可用连接则使用工厂函数创建新连接。
  4. Release 方法:将连接释放回连接池,如果池已满则关闭连接。
  5. main 函数:示例中展示了如何使用连接池来获取和释放连接。

标签:nil,err,示例,factory,sql,GO,连接,连接池
From: https://blog.csdn.net/weixin_49015143/article/details/140200203

相关文章

  • 从安装到配置,教你用Argo CD对接CCE集群完成测试、生产部署
    本文分享自华为云社区《ArgoCD对接CCE完成不同测试、生产环境业务部署》,作者:可以交个朋友。一背景说明ArgoCD是用于Kubernetes的声明性GitOps持续交付工具,遵循GitOps模式,该模式使用Git仓库作为定义所需应用程序状态的真实来源。ArgoCD可在指定的目标环境中自动部署所需的......
  • 基于Go1.19的站点模板爬虫
    要基于Go1.19创建一个站点模板爬虫,你可以使用Go语言的标准库和一些第三方库(如colly或goquery)来实现网页抓取和解析。以下是一个简单的示例,展示了如何使用colly库编写一个站点模板爬虫:安装Colly库:首先,确保你已经安装了Go,并设置好了Go的工作环境。然后使用以下命令安装col......
  • Microsoft SQL Server 2012 中常用的 Transact-SQL 命令示例,涵盖了数据库管理和查询操
    MicrosoftSQLServer2012中常用的Transact-SQL命令示例,涵盖了数据库管理和查询操作:创建数据库sqlCopyCodeCREATEDATABASEYourDatabaseName;删除数据库sqlCopyCodeDROPDATABASEYourDatabaseName;创建表sqlCopyCodeCREATETABLEEmployees(EmployeeIDIN......
  • 【机器学习】Google开源大模型Gemma2:原理、微调训练及推理部署实战
    目录一、引言二、模型简介2.1 Gemma2概述2.2Gemma2 模型架构三、训练与推理3.1Gemma2 模型训练3.1.1下载基座模型3.1.2 导入依赖库3.1.3量化配置3.1.4分词器和模型实例化3.1.5引入PEFT进行LORA配置 3.1.6样本数据清洗与加载3.1.7模型训练与保存3.......
  • 前端学习-flutter学习-002-计数器示例学习
    学习参考链接拆解代码学习Material是一种标准的移动端和web端的视觉设计语言,Flutter默认提供了一套丰富的Material风格的UI组件。//导入了MaterialUI组件库。import'package:flutter/material.dart';main函数为应用程序的入口。main函数中调用了runApp方法......
  • 当管理和维护 Active Directory 环境时,有一些基础的 PowerShell 命令可以帮助进行常规
    当管理和维护ActiveDirectory环境时,有一些基础的PowerShell命令可以帮助进行常规的检查和管理操作。以下是一些常用的基础检查命令示例:1.获取特定用户信息powershellCopyCode#获取特定用户的基本信息Get-ADUser-Identity"username"这个命令用于获取特定用户的基本......
  • 使用go语言实现快速排序、归并排序、插入排序、冒泡排序、选择排序
    冒泡排序(BubbleSort):原理:比较相邻的元素,如果前一个比后一个大,就交换它们。这个过程会使得每一轮最大的元素“冒泡”到数组的末尾。时间复杂度:O(n^2)稳定性:稳定//BubbleSort函数使用冒泡排序算法对数组进行排序funcBubbleSort(arr[]int){ n:=len(arr) fori:=0......
  • springboot 如何使用MongoDB集成 shedlock-spring
    ShedLock是一个用于防止在分布式环境中任务重复执行的库。它允许多个节点共享一个任务调度器,并确保同一时间只有一个节点能够执行某个任务。SpringBoot项目中可以通过集成shedlock-spring来实现这一功能。下面是一个完整的集成指南:1.添加依赖首先,需要在pom.xml中添加sh......
  • 当使用 PowerShell 管理 Active Directory(AD)域用户时,以下是一些初级的示例和操作:Power
    使用PowerShell管理ActiveDirectory(AD)域用户时,以下是一些常见的命令和示例:1.新增域用户powershellCopyCodeNew-ADUser-Name"JohnDoe"-GivenName"John"-Surname"Doe"-SamAccountName"johndoe"-UserPrincipalName"johndoe@domain.co......
  • golang 中 Jwt 的验证及续期使用
    创建Utils的Jwt文件,用于创建JwtToken 和  验证并继期packageutilsimport("errors""fmt""github.com/dgrijalva/jwt-go""strings""time")//生成JwtToken//@ParamsecretKey表示jwtsecretKey【***......