golang sqlite主从数据同步插件开发

复制代码
### golang sqlite主从数据同步插件开发

思路

参考Mysql的主从同步机制,Mysql是产生binlog,然后把binlog日志同步到从服务上。

同理,我们按sql执行顺序记录所有的增删改查的sql语句,然后调用接口把sql语句传到从服务上执行。

数据库驱动使用的是 GORM。

编写gorm插件

golang 复制代码
type Plugin interface {
	Name() string
	Initialize(*gorm.DB) error
}
type TracePlugin struct {
}

func (op *TracePlugin) Name() string {
	return "tracePlugin"
}

func (op *TracePlugin) Initialize(db *gorm.DB) (err error) {

	// 在这些sql操作后执行after方法,只记录增 删 改的语句
	_ = db.Callback().Create().After("gorm:after_create").Register("after_create", after)
	_ = db.Callback().Delete().After("gorm:after_delete").Register("after_delete", after)
	_ = db.Callback().Update().After("gorm:after_update").Register("after_update", after)
	return
}

func after(db *gorm.DB) {
	
	err := db.Error
	//sql执行成功
	if err == nil {
		//获取sql
		sql := db.Dialector.Explain(db.Statement.SQL.String(), db.Statement.Vars...)
		if strings.Contains(sql, "refresh_token") {
			//过滤不需要的sql
			return
		}
		//远程调用执行sql语句
		sendExecSql(sql)

	}

	return
}

使用插件

golang 复制代码
var SqliteDb *gorm.DB

func init() {
	var err error
	SqliteDb, err = gorm.Open(sqlite.Open("sqlite.db"), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 不要复数表名
		},
		Logger:      logger.Default.LogMode(logger.Info), // 打印 SQL 语句
		PrepareStmt: true,
	})
	if err != nil {
		fmt.Printf("connect DB failed, err:%v\n", err)
		return
	}
	fmt.Println("connect DB success")
	

	db, err := SqliteDb.DB()
	// 空闲状态下的最大连接数,默认的最大空闲连接数为2
	db.SetMaxIdleConns(10)
	// 最大打开连接数, 默认值为0(无限制)
	db.SetMaxOpenConns(100)
	// 设置连接可以重复使用的最长时间
	db.SetConnMaxLifetime(time.Hour)
	

	//使用插件
	SqliteDb.Use(&plugins.TracePlugin{})
}

注意

sql要按顺序发送给从库执行,执行后要返回结果,返回成功后在发送下一条执行。

参考链接:

https://gorm.io/zh_CN/docs/write_plugins.html

https://studygolang.com/articles/32886?fr=sidebar

相关推荐
Achou.Wang11 小时前
源码分析 golang bigcache 高性能无 GC 开销的缓存设计实现
开发语言·缓存·golang
weixin_4211334112 小时前
Django 的文档接口
python·django·sqlite
Yeats_Liao12 小时前
Go语言技术与应用(二):分布式架构设计解析
开发语言·分布式·golang
蓝婴天使12 小时前
基于 React + Go + PostgreSQL + Redis 的管理系统开发框架
react.js·postgresql·golang
脚踏实地的大梦想家12 小时前
【Go】P6 Golang 基础:流程控制
开发语言·golang
QX_hao13 小时前
【Go】--数组和切片
后端·golang·restful
-睡到自然醒~13 小时前
提升应用性能:Go中的同步与异步处理
开发语言·后端·golang
只吃不吃香菜13 小时前
Go WebSocket 协程泄漏问题分析与解决方案
开发语言·websocket·golang
ChineHe14 小时前
Golang并发编程篇001_并发编程相关概念解释
开发语言·后端·golang
赴前尘16 小时前
Go 通道非阻塞发送:优雅地处理“通道已满”的场景
开发语言·后端·golang