Go语言中文网 为您找到相关结果 309

database/sql包连接池解读

连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读database/sql包的连接池实现来给自己一些参考和启发。首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.htm...阅读全文

最近看了篇文章,有一部分内容是关于端口号数量限制的,感觉是作者理解错误了,有懂的帮忙解答一下

16位的端口号数量有限,如果每次后端交互都需要新建连接,理论上来说,同时请求后端Service的Goroutine数量无法超过65535这个硬性限制,在如今这个动辄“十万”“百万”高并发时代,最高6w并发貌似不太拿得出...阅读全文

Go网络开发中的两个技术点

最近碰到群里网友问如果检查网络连接的Timeout,联想最近看到的另一个问题, 在这篇文章统一记录一下。 如果检查一个网络错误是Timeout导致的? 自 Go 1.6开始, 所有的超时导致的网络错误都可以通过net.Error的Timeout()方法检查。 123if err, ok := err.(net.Error); ok && err.Timeout() { ……} 更早版本的Go并没有专门的检查Timeout方法。 可以参考: https://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error 产品中一定不要使用默认的http.Get 如果你觉得方便,直接使用http.Get或者类似的...阅读全文

博文 2018-08-31 08:59:05 smallnest

go优雅升级/重启工具调研

对于一个常驻、高访问量的网络服务来说,升级/重启时,一个难以忽视的问题是避免对正在通信的客户端造成影响。因此大家一直在寻求一种优雅、零宕机的升级/重启方案(seamless reload/upgrade)。在工程师们的日常实践中,尝试了不同的方案。各方案的核心都是fork-exec流程,其不同的区别就是在这个过程中,如何优雅的传递活跃的网络连接,如何避免新建连接失败,以及处理这个过程中的错误和如何回退。 方案选型 首先先简单介绍一些方案1: SO_REUSEPORT 多进程 在HAProxy 1.5.11时,采用该方案。首先可以对监听 socket 启用SO_REUSEPORT,这样可以使得多个监听 socket 共享同一个地址,这样可以使得我们能同时启动多个进程来监听同一个地址。在升级或重...阅读全文

golang学习之旅:使用go语言操作mysql数据库

1.下载并导入数据库驱动包官方不提供实现,先下载第三方的实现,点击这里查看各种各样的实现版本。这里选择了Go-MySQL-Driver这个实现。地址是:https://github.com/go-sql-driver/mysql/。然后按照里面的说明下载驱动包:$ go get github.com/go-sql-driver/mysql最后导入包即可:import "database/sql" import _ "github.com/go-sql-driver/mysql" 2.连接至数据库db, err := sql.Open("mysql", "root:root@/uestcbook")3.执行查询(1)Exec result, err := db.Exec( "INSERT IN...阅读全文

博文 2018-04-03 14:58:42 FabioPLA

Using Go with Redis

在Go语言中使用redis数据库 连接到Redis 存储和获取数据 解码成json 最后应该在web应用中使用一个连接池 在Go语言中使用redis数据库 日期:2016-09-13 作者:未知 原文:https://dinosaurscode.xyz/go/2016/09/13/using-go-with-redis/?utm_source=studygolang&utm_medium=email&nsukey=d7foHOu2JWuVtNx567nmYebGiV3xA77Y66gJwySUW6tBi9LTombwJLWAzrYVdYP1IZH1MZzOhcz%2BGh8xt%2FggTToFElonX%2FrUuMc%2B%2FT0eQnzrZLJM7%2BkF8QNBQ3zfhlNkQ...阅读全文

博文 2016-11-23 10:00:00 zistxym

用golang实现mongodb数据库连接池-高级篇-协程安全

版本 golang -- 1.12.4 mongodb -- 4.0 go driver -- 1.0.0 简介 在上一篇《用golang实现mongodb数据库连接池-基本篇》我们实现了mongodb的golang driver按序使用的基本版,但还需要进一步提升效率和高并发安全。本篇张实现高效率协程安全版。 data race 什么是data race,考虑如下代码: var balance int func Deposit(amount int){ balance = balance + amount} func Balance() int { return balance} //Alice: go func(){ bank.Deposit(200) // A1 fmt.Println...阅读全文

博文 2019-05-14 11:34:52 kmnemon

六、protobuf的使用和原理

protobuf详解 1、安装 源码包下载 git clone https://github.com/google/protobuf 安装依赖 sudo apt-get install autoconf automake libtool curl make g++ unzip 生成需要的配置脚本 cd protobuf //进入源码库中 ./autogen.sh //运行脚本生成需要的配置脚本 编译安装 ./configure make make check sudo make install sudo ldconfig //用于刷新共享库的缓存 安装proto-gen-go go get -u github.com/golang/protobuf/proto go get -u githu...阅读全文

博文 2019-01-13 16:34:39 yongfutian

golang连接mysql操作示例增删改查

golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好。下面演示下具体的使用,完整代码示例可以参考最后。 下载驱动 sudo go get github.com/go-sql-driver/mysql 如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决 sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sq...阅读全文

博文 2015-10-14 13:54:17 陈杰斌

go database/sql 源码分析(三)sql.DB数据结构

package sql 中最核心的的数据结构是sql.DB, 其为上层应用程序提供一个统一的抽象体,它不代表一个数据库连接,也不代表一个连接池,其是sql的包的作者为了实现:并发访问安全控制,连接池等诸多功能而设计的一个综合抽象数据结构。具体见代码注释 221 type DB struct { #通过driverName获取driver,通过driver的Open()方法获得到DB的原始连接,sql.Open() 创建一个DB实例 222 driver driver.Driver #DB连接字符串,创建DB实例不会理解创建连接,只有使用的时候才去创建连接 223 dsn string 224 // numClosed is an atomic counter which represents...阅读全文

Twitter snowflake ID 算法之 golang 实现

是什么? snowflake ID 算法是 twitter 使用的唯一 ID 生成算法,为了满足 Twitter 每秒上万条消息的请求,使每条消息有唯一、有一定顺序的 ID ,且支持分布式生成。 主要解决了高并发时 ID 生成不重复的问题 结构 snowflake ID 的结构是一个 64 bit 的 int 型数据。 如图所示 : 1 bit:不使用,可以是 1 或 0 41 bit:记录时间戳 (当前时间戳减去用户设置的初始时间,毫秒表示),可记录最多 69 年的时间戳数据 10 bit:用来记录分布式节点 ID,一般每台机器一个唯一 ID,也可以多进程每个进程一个唯一 ID,最大可部署 1024 个节点 12 bit:序列号,用来记录不同 ID 同一毫秒时的序列号,最多可生成 4096...阅读全文

Go语言使用Golang连接MongoDB数据库实现增删改查

Go语言使用Golang连接MongoDB数据库实现增删改查 1.通过mongodb服务端口号启动mongodb服务 text 2.连接mongodb数据库 3.插入数据到持久层mongodb中 4.在持久层mongodb中删除数据 5.将数据在持久层mongodb中更改 6.在数据库中查询单条或多条数据 7.显示数据库集合中元素数目 本文转载自:http://www.hemadaili.com/help/news/detail/5d54ff289f02b700084d92a5.htm...阅读全文

博文 2019-08-16 15:03:16 犀牛代理

golang连接mysql操作示例增删改查

golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动,更新维护都比较好。下面演示下具体的使用,完整代码示例可以参考最后。 下载驱动 sudo go get github.com/go-sql-driver/mysql 如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决 sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sq...阅读全文

博文 2017-11-28 07:03:10 mickelfeng

Mecached Client for Golang

# Memcached Client for Golang golang版本的memcached客户端,使用二进制协议,支持分布式,支持连接池,支持多种数据格式 ### [](https://github.com/pangudashu/memcache#特性)特性 * 支持多server集群 * 与memcached使用二进制协议通信 * 支持连接池 * 存储value支持golang基本数据类型:string、[]byte、int、int8、int16、int32、int64、bool、uint8、uint16、uint32、uint64、float32、float64、map、结构体,不需要单独转为string存储 * Replace、Increm...阅读全文

redis连接池问题

比如就一个服务A,部署在服务器1上。 redis部署在服务器2上。 为什么还会需要redis连接池这个东西?我在服务A上维护一个全局变量的redis连接实例,前端请求过来我都是用这个连接实例去执行redis指令,不也可以吗? redis连接池,无非就是高并发的时候可以支持多个redis连接实例去连接redis,但是redis本身就是单线程的,我多个连接同时去连redis(不还是得排队么),然后执行指令,和我单个全局连接直接去一个个执行redis指令,感觉应该差不多性能吧? 而且如果是全局单个redis连接的话,每次请求过来我还省了连接这个操作,不是又省了点时间么...阅读全文

db服务器在游戏服务器组中的作用

文:https://blog.csdn.net/narlon/article/details/81835003 db(一般是mysql,或是类似的,比如mariadb)在游戏服务器中,启动了数据落地的作用。游戏服务器可以直接和db建立访问连接操作数据,或者通过一个中间人(DbServer)来完成这个工作。本文,我们以独立DbServer来分析带来的好处,以及遇到的问题。 下文提到的一些优势,如果不单独封装一个db服务器(通过一个存储模块的方式来实现)也可能可以做到。但如果有一个独立的db服务器时,更容易把这一点实现的比较纯粹。 适配存储过程,隐藏存储细节 db服务器可以做到,缓存数据存储到redis,超时数据mysql落地,而外层数据完全无感。同样的,当底层进行存储切换,或是升级时,只需要改...阅读全文

博文 2019-01-01 12:34:45 Golang语言社区

golang的垃圾回收与Finalizer——tcp连接是如何被自动关闭的

最近在做一个golang的连接池。测试过程中发现一个有趣的现象,获取的连接没有归还给连接池,那么过一段时间后该连接会自动关闭掉。猜测这跟连接池应该是没有关系的,于是再用普通的连接做了实验,即dial一个tcp连接,发送请求,然后程序进入sleep,一段时间后该连接还是会自动关闭。 对这个过程进行抓包分析,发现主动关闭连接的是client端,即client端主动向服务端发送了FIN包。 考虑到golang有垃圾回收机制,如果该连接被程序引用着怎么办?是否也会自动关闭?想想这应该是不可能的,那这是不是跟垃圾回收有关系?! 对程序稍作改动,在发送完第一个请求之后,保留该连接的reference不释放,进入sleep。观察一段时间,无论过多久,netstat查看该连接都是ESTABLISHED状态的...阅读全文

博文 2016-09-08 07:00:11 wang_xijue

go语言之行--golang操作redis、mysql大全

一、redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value类型的数据库,并提供多种语言的API。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在...阅读全文

博文 2018-07-18 18:30:01 wdliu

kcp的优势

传输数据上增加包头 ``` conv:连接号。UDP是无连接的,conv用于表示来自于哪个客户端。对连接的一种替代 cmd:命令字。如,IKCP_CMD_ACK确认命令,IKCP_CMD_WASK接收窗口大小询问命令,IKCP_CMD_WINS接收窗口大小告知命令, frg:分片,用户数据可能会被分成多个KCP包,发送出去 wnd:接收窗口大小,发送方的发送窗口不能超过接收方给出的数值 ts:时间序列 sn:序列号 una:下一个可接收的序列号。其实就是确认号,收到sn=10的包,una为11 len:数据长度 data:用户数据 ``` 1.超时重传加速: TCP超时计算一次就是RTOx2,何况3次,而KCP启动快速模式后可设置超时时间(大家都说1.5比较好),提高了传输速度。 2.选择重...阅读全文

博文 2020-02-26 17:41:42 lwcbest

更好的 Golang 的 MongoDB 驱动 `globalsign/mgo`

用 1.3 版本使用 Go 开始,连接 MongoDB 使用的驱动中,最常见的就是:mgo.v2 这个库一度是唯一的选择,它的接口设计合理,与 Golang/MongoDB/bson 适配的也做的不错。然而这个库长期处于无人看管的状态,有一大堆让人难以忍受 bug,其中我们遇到的就有不少: 当短时间执行大量 db 操作把并发执行的与 MongoDB 的连接池增大之后,多余的连接没有被正确的回收掉(即便设置了 maxIdleTimeout 和 minPoolSize)。 执行 bulk 操作的 size 是固定不可配置的。 在我们的线上项目中,偶尔的业务峰值会照成某几个服务短时间大量的 db 操作,而一旦这些 db 操作带来的连接数量被撑大之后,耗尽 db 的连接数资源之后。其他的服务就无法连...阅读全文

博文 2019-08-28 17:32:47 SpikeQin

电脑换IP-更换内网ip地址

要改公网的的IP首先是你有PPTP的帐号密码服务器地址,有了后点击图一建立新的网络连接,点击连接到工作区。点击连接到我的,输入服务器的地址点击下一步。输入帐号密码后点击下一步,接着点击立即连接即可。如果你拥有的是国外的帐号,那么连接后就是国外的IP地址了。等于是更换了公网的IP地址...阅读全文

博文 2019-03-06 10:41:18 xiniuxiaoniu

Gorm 源码分析(一) database/sql

简介 Gorm是Go语言开发用的比较多的一个ORM。它的功能比较全: 增删改查 关联(包含一个,包含多个,属于,多对多,多种包含) CallBacks(创建、保存、更新、删除、查询找)之前 之后都可以有callback函数 预加载 事务 复合主键 日志 database/sql 包 但是这篇文章中并不会直接看Gorm的源码,我们会先从database/sql分析。原因是Gorm也是基于这个包来封装的一些功能。所以只有先了解了database/sql包才能更加好的理解Gorm源码。database/sql 其实也是一个对于mysql驱动的上层封装。"github.com/go-sql-driver/mysql"就是一个对于mysql的驱动,database/sql 就是在这个基础上做的基本封装...阅读全文

博文 2019-06-05 00:32:37 大二小的宝

监控io性能、free、ps、查看网络状态和linux抓包工具

监控io性能、free、ps、查看网络状态和linux抓包工具 一、监控io性能 1、iostat -x 磁盘使用 1 关注最后一列的数值,数值大说明磁盘有异常 2、iotop 磁盘使用 安装:yum install -y iotop 2 二、free命令 查看内存使用多少,剩余多少请看第二行的数据。另外我们还可以加-m或-h 或者-g选项分别以M或G为单位打印内存使用状况: 常用: free -h 3 三、ps命令 ps查看系统进程 用法:ps aux 或 ps -elf 4 PID :进程的id,想终止某一个进程,则用 ‘kill 进程的pid 有时并不能杀掉,则需要加一个-9选项了 kill -9 进程pid STAT :表示进程的状态 D:不能中断的进程(通常为IO) R: 正在运行...阅读全文

博文 2019-01-09 22:34:41 Golang语言社区

kinesis概念介绍 golang/python3/命令行 使用教程

Kinesis 的整体架构如下: image.png Kinesis 的基本术语 Kinesis Data Stream Kinesis Data Stream 实时吸收大量数据、持久存储数据并使这些数据可供使用。其由多个分片组成,每个分片里面包含一系列数据记录,每个数据记录有一个由 Kinesis Data Stream 分配的序列号。 数据记录 数据记录是存储在 Kinesis data stream 中的数据单位。数据记录由序列号、分区键和数据 Blob 组成,数据 Blob 可以是 最多 1 MB,并且是不可变的。 保留周期 数据记录在添加到流中后保存的时长,默认保存 24 小时,可以设置为更久的值,最长保存 168 小时,但是设置超过 24 小时的保留周期是会额外收费哦。 分片 分...阅读全文

博文 2019-12-11 18:32:44 SailSea

Golang MySQL

2839526_203626093214_2.jpg 库: database/sql : database/sql 是 golang 的标准库之一,它提供了一系列接口方法,用于访问关系数据库。它并不会提供数据库特有的方法,那些特有的方法交给数据库驱动去实现。 database/sql库提供了一些 type。这些类型对掌握它的用法非常重要。 DB : 数据库对象。 sql.DB 类型代表了数据库。和其他语言不一样,它并是数据库连接。golang 中的连接来自内部实现的连接池,连接的建立是惰性的,当你需要连接的时候,连接池会自动帮你创建。通常你不需要操作连接池。一切都有go来帮你完成。 它提供了一些跟数据库交互的函数,同时管理维护一个数据库连接池,帮你处理了单调而重复的管理工作,并且在多个gor...阅读全文

博文 2020-06-02 17:32:49 chengchaos

gorose orm新版本(0.8.0)发布,新增连接池等特色功能

gorose orm新版本(0.8.0)发布,新增连接池等特色功能 经过几个日夜, gorose群众多个成员的共同艰苦奋战, 全新版本 0.8.0 发布, 在遵循简单易用的基础之上, 做出了许多改进. gorose orm既然号称 gol orm中最风骚的orm, 这次的改进, 也是风骚范儿十足, 下面我们一起来看看改进后的特色吧: 一. 按照开源项目标准重构目录,让更多的人可以自由协作共同开发 /docs/ ---- 文档目录, 这里包含多个语言的不同使用文档 /drivers/ ---- 不同数据库的驱动目录, 可以自由增加任何其他数据库的目录 /examples/ ---- 使用示例目录, 可以在这里找到大部分的用例 /test/ ---- go testing 自动测试, 包括简单的...阅读全文

golang的sql.DB的一些注意事项及读写锁的总结

最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。 首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕后归还给连接池,所以假设用golang的sql模块,一个程序一个DB就行了。 既然有连接池的支持,那么也要注意千万不要泄露连接池的连接。假设你采用Query来执行查询语句,那么会返回一个sql.Rows结构,这个结构会占用一个连接,只有在遍历完才会自动关闭,所以最好是获得了Rows后执行一次Rows的Clos...阅读全文

博文 2016-09-04 10:00:03 sryan

基于Go和Redis实现一个简单易用的消息队列

项目地址 Github: github.com/wuzhc/gmq 喜欢的可以star一下 ^_^ 1. 概述 gmq是基于redis提供的特性,使用go语言开发的一个简单易用的队列;关于redis使用特性可以参考之前本人写过一篇很简陋的文章Redis 实现队列; gmq的灵感和设计是基于有赞延迟队列设计,文章内容清晰而且很好理解,但是没有提供源码,在文章的最后也提到了一些未来架构方向; gmq不是简单按照有赞延迟队列的设计实现功能,在它的基础上,做了一些修改和优化,主要如下: 功能上 多种任务模式,不单单只是延迟队列;例如:延迟队列,普通队列,优先级队列 架构上: 添加job由dispatcher调度分配各个bucket,而不是由timer 每个bucket维护一个timer,而不是所有b...阅读全文

博文 2019-07-08 10:34:24 wuzhc

从简单的即时聊天来看架构演变by golang

前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的。 我将从一个最简单的聊天室的功能来实现,看看这样一个说起来好像很简单但的功能,我们需要考虑哪些问题。 我使用golang实现,从0开始实现,需要借助的是websocket来实现即时,基础知识自己补一下,这里不做过多赘述。 各个版本和测试客户端所有的代码都已经上传github,如果有需要请查看,https://github.com/LinkinStars/simple-chatroom 功能描述 即时聊天室包含功能(这里写出的功能假设就是产品经理告诉我们的): 1、所用用户能连接聊天室 2、连接成功的用户能向聊天室发送消息 ...阅读全文

博文 2019-06-10 17:34:04 LinkinStar

golng mysql库连接池分析

0x1 背景 golang的协程是好用,但是有时候瓶颈并不在语言上,而是在后面的数据源上面,例如我们常见的mysql,redis等,当一个后端服务很多请求的时候,语言是能hold得住,但是 mysql产生错误,比如 too many connection, too many time_wait 等等这些,今天我们就分析一下怎么解决这种问题 0x2 代码范例 请查看main.go, halokid (有帮忙的话请start或者follow一下哦,谢谢) 0x3 分析 只执行ini函数, 检查mysql的进程显示为(原有的mysql是没有进程在处理的) 没执行前 mysql> show processlist; +----+-----------------+------------------...阅读全文

fabric-ca国密改造记录及思路

Fabric CA提供以下功能: 1、身份注册,或者将连接到LDAP作为用户注册; 2、颁发登录证书(ECerts); 3、颁发交易证书(TCerts),保证链上交易的匿名性与不可连接性; 4、证书续期与撤销看一个 fabric-ca服务器在Hyperledger Fabric中架构图如下:​ 有两种与Hyperledger Fabric CA服务器交互的方式:通过Hyperledger Fabric CA客户端或通过一个Fabric SDK。 与Hyperledger Fabric CA服务器的所有通信都是通过REST API进行的;fabric ca中国密改造需要修改的程序目录如下:一、cmd目录 1、cmd目录主要提供了fabric-ca-client,fabric-ca-server...阅读全文

博文 2019-11-07 09:22:06 545305939

【转】golang websocket hub连接的实现

package main type hub struct { // 注册了的连接器 connections map[*connection]bool // 从连接器中发入的信息 broadcast chan []byte // 从连接器中注册请求 register chan *connection // 从连接器中注销请求 unregister chan *connection } var h = hub{ broadcast: make(chan []byte), register: make(chan *connection), unregister: make(chan *connection), connections: make(map[*connection]bool), } f...阅读全文

博文 2017-10-20 10:04:46 大雁儿

写在学习golang一个月后

遇到的问题连接池。由于PHP没有连接池,当高并发时就会有大量的数据库连接直接冲击到MySQL上,最终导致数据库挂掉。虽然Swoole有连接池,但是Swoole只是PHP的一个扩展,之前使用Swoole过程中就踩过很多的坑。经过我们的讨论还是觉得使用Golang更加可控一些。框架的选择在PHP中一直用的是Yaf,所以在Go中自然而言就选择了Gin。因为我们一直以来的原则是:尽量接近底层代码。封装过于完善的框架不利于对整个系统的掌控及理解。我不需要你告诉我这个目录是干嘛的,这个配置怎么写,这个函数怎么用等等。>>>阅读全...阅读全文

博文 2018-09-03 16:35:53 倔强_beaf

Go语言与MySql数据库(中)——Go与MySql交互

一、打开mysql数据库 1 下载并导入数据库驱动包 我们选择了Go-MySQL-Driver这个实现。地址是:https://github.com/go-sql-driver/mysql/。 下载驱动包: $ go get github.com/go-sql-driver/mysql 2 导入包: 通常来说, 不应该直接使用驱动所提供的方法, 而是应该使用sql.DB, 因此在导入 mysql 驱动时, 这里使用了匿名导入的方式(在包路径前添加 _), 当导入了一个数据库驱动后, 此驱动会自行初始化并注册自己到Golang的database/sql上下文中, 因此我们就可以通过 database/sql 包提供的方法访问数据库了. import "database/sql" import ...阅读全文

博文 2018-12-21 23:34:43 一梦千嬅

go database/sql 源码分析(二)driver包设计哲学

驱动接口设计特点 驱动层设计很简单,没有并发锁的控制 驱动层的设计是基于单个连接的,没有考虑连接池 驱动层事务Tx和Stmt是独立分离的,Tx只有两个简单的方法就是Commit() 和Rollback() 驱动的具体实现者只需要在单个连接上实现驱动层的API接口即可 driver包的数据结构 调用关系 驱动注册 具体的数据库驱动只需要按照接口层的定义,实现api,然后在sql包的全局驱动切片sql.drivers中注册即可。 27 var ( 28 driversMu sync.RWMutex 29 drivers = make(map[string]driver.Driver) 30 ) 38 func Register(name string, driver driver.Driver)...阅读全文

博文 2016-09-12 01:00:01 hittata

dive into golang database/sql(1)

数据库操作是一个应用必不可少的部分,但是我们很多时候对golang的sql包仅仅是会用,这是不够的。每一条语句的执行,它的背后到底发生了什么。各式各样对sql包的封装,是不是有必要的,有没有做无用功? 这是go to database package系列文章的第一篇。本系列将按照程序中使用sql包的顺序来展开 先来看一段简短的代码: package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) func main() { db, err := sql.Open("mysql", "user:password@/dbname") if nil != err { panic(err) } age :...阅读全文

博文 2017-04-06 03:09:08 suoga

一个TCP长连接设备管理后台工程(三)

前篇: 一个TCP长连接设备管理后台工程(一)一个TCP长连接设备管理后台工程(二) Github仓库地址 TCP协议整合JTT808协议 前面简单说明了基于golang的net库进行TCP通讯。现在我们需要将现有的协议整合进去。行业内车辆终端一般都是对接交通部的JTT808协议,此处我们要实现的是JTT808-2019版本。 消息结构 标识位 消息头 消息体 校验码 标识位 0x7e 0x7e 标识位应采用0x7e表示,若校验码、消息头以及消息体中出现0x7e及0x7d,则要进行转义处理。转义规则定义如下: 先对0x7d进行转义,转换为固定两个字节数据:0x7d 0x01; 再对0x7e进行转义,转换为固定两个字节数据:0x7d 0x02。 转义处理过程如下: 发送消息时:先对消息进行封装...阅读全文

博文 2019-12-27 17:32:42 qiuzhiqian

如何通过MD5反查身份证号?

题目:设计一个身份证查询系统,将身份证号md5 之后存储,输入md5值查询对应的身份证号。 要求:成本低,查询速度快 设计思路: 将所有可能的身份证号做一个简单的统计计算数据量 根据数据量选择存储方式 查询 身份证生成规则: 身份号码是特征组合码,由前十七位数字本体码和最后一位数字校验码组成。排列顺序从左至右依次为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 地址码: 表示编码对象常住户口所在县(市、旗、区)的行政区划代码。对于新生儿,该地址码为户口登记地行政区划代码。需要没说明的是,随着行政区划的调整,同一个地方进行户口登记的可能存在地址码不一致的情况。行政区划代码按GB/T2260的规定执行。 出生日期码:表示编码对象出生的年、月、日,年、月、日代码之间不用分隔符...阅读全文

Go 其他特性

Go 其他特性 为了保持 Go 语法介绍的完整性,有一些 Go 独有的特性,并没有在前面的章节介绍。说 Go 独有的特性其实并不恰当,因为其他语言并非在语言层面定义上下面的几个特性。 本节想介绍的关键字与函数包括 defer, append, close, make, new, copy, delete,只有第一个是关键字,后6个都是内置函数。 defer defer 是 Golang 中的广义的通用析构函数。析构函数是在Java,C++类中所定义的一类在类被销毁时执行收尾的函数。什么叫收尾,就是类似于离家出门前总是要锁门;下班了总是要打卡这样一类,默认都需要在结束时做的事情。在函数结束时,哪些工作需要收尾呢? 打开的文件要关闭,不管发生读写任何操作; 打开的网络连接要关闭,不管你访问了哪些...阅读全文

博文 2018-11-26 17:34:44 PRE_ZHY

服务超时总结

介绍 超时 请求超时,客户端给服务端发送请求时超时,此时服务端没有收到客户端的请求; 服务端内部超时,服务端可能存在DB操作、IO操作、调用其他服务超时; 响应超时,服务端给客户端返回响应时超时,此时服务端已经处理了请求。 超时发生需要客户端和服务端如何处理呢? 客户端最常见方法: 重试(前提是服务端接口支持幂等),重试间隔梯度增大,重试次数阈值最大值 不重试直接去查询请求结果状态,根据结果确认是否请求成功,或者什么都不处理,直接认为失败不做进一步处理 具体接口场景具体对待 服务端: 服务端内部如果超时了,应该尽快给客户端返回,告诉客户端超时失败,这个主要是通过服务端内部超时控制来实现,例如:golang http.TimeoutHandler 幂等性 支持接口无限重试主要靠的就是幂等性,实...阅读全文

博文 2019-08-20 22:02:43 凯文不上班

【转】golang 三个点省略号的作用总结

文链接:https://blog.csdn.net/qq_31930499/article/details/98353008 1.使用在数组中 在数组字面量中,如果省略号"..."出现在数组长度的位置,那么数组的长度由初始化数组的元素个数决定。 q := [...]int{1,2,3} fmt.Printf("%T\n",q) //"[3]int" 2.打散Slice package main import ( "fmt" ) func main() { var arr1 []int arr2 := []int{1,2,3} arr1 = append(arr1,0) arr1 = append(arr1,arr2...) //arr2... 将切片arr2打散成 ==> arr1 = ap...阅读全文

博文 2020-03-11 17:33:03 10xjzheng

golang连接mysql操作示例增删改查

http://www.01happy.com/golang-mysql-demo/ 下载驱动 sudo go get github.com/go-sql-driver/mysql 如果提示这样的失败信息:cannot download, $GOPATH not set. For more details see: go help gopath,可以使用如下命令解决 sudo env GOPATH=/Users/chenjiebin/golang go get github.com/go-sql-driver/mysql GOPATH的值根据自行环境进行替换。 创建测试表 在mysql test库中创建测试表 CREATE TABLE IF NOT EXISTS `test`.`user` (...阅读全文

博文 2016-09-05 15:00:04 liukuan73

dive into golang database/sql(3)

上一章中我们一起探讨了golangdatabase/sql包中如何获取一个真实的数据库连接。当我们拿到一个数据库连接之后就可以开始真正的数据库操作了。本章讲继续深入,一起探讨底层是如何进行数据库操作的。 上一章中我们说到: db.Query() 实际上分为两步: 获取数据库连接 在此连接上利用driver进行实际的DB操作 func (db *DB) query(query string, args []interface{}, strategy connReuseStrategy) (*Rows, error) { ci, err := db.conn(strategy) if err != nil { return nil, err } return db.queryConn(ci, c...阅读全文

博文 2017-04-06 03:09:23 suoga

golang and mogodb

1、golang的mogodb包下载:http://gopkg.in/mgo.v2 http://gopkg.in/mgo.v2/bson 2、golang的mongodb操作(mgo):https://studygolang.com/articles/1737 3、mgo 的 session 与连接池:http://www.cnblogs.com/logo-fox/p/7016017.html 4、Mongodb学习笔记:http://www.cnblogs.com/eggTwo/p/4040252.htm...阅读全文

博文 2017-11-14 12:00:05 cythical-l-zc

golang的sql.DB的一些注意事项及读写锁的总结

最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。 首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕后归还给连接池,所以假设用golang的sql模块,一个程序一个DB就行了。 既然有连接池的支持,那么也要注意千万不要泄露连接池的连接。假设你采用Query来执行查询语句,那么会返回一个sql.Rows结构,这个结构会占用一个连接,只有在遍历完才会自动关闭,所以最好是获得了Rows后执行一次Rows的Clos...阅读全文

Go每日精选(2019-06-15)

基础部分 1.我们用 Go 替换 Python 的原因 2.为什么我最喜欢的编程语言是 Go 3.Golang json解析与生成 4.go mod 使用 5.在Go中构建并发TCP服务器 进阶部分 1.记一次go panic问题的解决过程 2.记一次golang中sync.Map并发创建、读取的问题 3.golang复用http.request.body 4.golang sql连接池的实现方法详解 5.图解Golang的内存分...阅读全文

博文 2019-06-15 19:32:40 凯文不上班