近期在寻找Go工程可以用的开源分库分表中间件,找了3个:ShardingSphere-Proxy,Kingshard,Gaea,下面给出测试过程和对比结果

ShardingSphere-Proxy

https://github.com/apache/shardingsphere

有apache基金会支持,社区活跃

Kingshard

https://github.com/flike/kingshard

个人项目,github已经不更新了

Gaea

https://github.com/XiaoMi/Gaea

小米团队发布,最近更新是2024年9月,还算比较新

测试代码


package main import (
"database/sql"
"encoding/json"
"fmt"
"math/rand"
"sharding/internal/models"
"strings"
_ "github.com/go-sql-driver/mysql" // 导入 MySQL 驱动
"log"
) const (
// 定义颜色的 ANSI 转义序列
Reset = "\033[0m"
Red = "\033[31m"
Green = "\033[32m"
Yellow = "\033[33m"
Blue = "\033[34m"
) func main() { log.Println(Red + "shardingsphere-proxy test" + Reset)
dsn_proxy := "sharding:sharding@tcp(127.0.0.1:13308)/sharding_user?charset=utf8mb4&parseTime=True&loc=Local"
sharding_query(dsn_proxy) log.Println(Yellow + "kingshard test" + Reset)
dsn_kingshard := "kingshard:kingshard@tcp(127.0.0.1:9696)/sharding_user?charset=utf8mb4&parseTime=True&loc=Local"
sharding_query(dsn_kingshard) log.Println(Blue + "gaea test" + Reset)
dsn_gaea := "sharding_gaea:sharding_gaea@tcp(127.0.0.1:13306)/sharding_user?charset=utf8mb4&parseTime=True&loc=Local" sharding_query(dsn_gaea)
} func sharding_query(dsn string) { //sharding proxy shardingProxyConn, err := sql.Open("mysql", dsn)
if err != nil {
log.Println(err)
return
}
defer shardingProxyConn.Close() id := rand.Intn(10)
userName := fmt.Sprintf("test%d", id)
notFound := false // 完整sql,无传参
var uid uint64
valScope := strings.ReplaceAll(userName, "'", "\\'")
err = shardingProxyConn.QueryRow(fmt.Sprintf("select id from t_user where login_name = '%s'", valScope)).Scan(&uid)
if err != nil {
if err == sql.ErrNoRows {
log.Println("query 1 fail 1: ", err.Error())
notFound = true
} else {
log.Println("query 1 fail 2:", err)
}
} else {
log.Println("query 1 success, uid=", uid)
} // sql传参
err = shardingProxyConn.QueryRow("select id from t_user where login_name = ?", userName).Scan(&uid)
if err != nil {
if err == sql.ErrNoRows {
log.Println("query 2 fail 1: ", err.Error())
notFound = true
} else {
log.Println("query 2 fail 2:", err)
}
} else {
log.Println("query 2 success, uid=", uid)
}
// create
if notFound {
// sharding-proxy 有 id 自动生成配置,这里方便测试需要,指定id
sqlIns := "INsert into t_user (id, login_name,passwd,email) values (?, ?, ?, ?)"
result, err1 := shardingProxyConn.Exec(sqlIns, id, userName, "test1234", "test@test.com")
if err1 != nil {
log.Println("insert fail:", err1)
} else {
rowsAffected, _ := result.RowsAffected()
log.Println("insert RowsAffected ", rowsAffected)
}
} //Select rows, err := shardingProxyConn.Query("select id,login_name,email,create_time,update_time from t_user where login_name like ? limit 10", "%test%")
if err != nil {
log.Println(err)
return
}
defer rows.Close() var userList []models.UserModel
for rows.Next() {
var u models.UserModel
e := rows.Scan(&u.ID, &u.LoginName, &u.Email, &u.CreatedTime, &u.UpdateTime)
if e != nil {
log.Println("row scan err:", e)
continue
}
userList = append(userList, u)
}
j, _ := json.Marshal(userList)
log.Println("select result:", string(j))
}

测试结论

shardingsphere-proxy 4.1

  1. 分表查询不支持占位符传参,插曲:php测试过支持传参使用
  2. 分表只支持全SQL

kingshard

  1. 分表查询不支持占位符传参,插曲:php测试过支持传参使用
  2. 分表查询支持全SQL

Gaea

  1. 分表查询支持占位符传参
  2. 分表查询支持全SQL

结论对比

Go代码的工程应用想用分库分表中间件,推荐次序

第1首选优先Gaea,因为支持占位符传参,github最近更新是2024年9月

第2是shardingsphere-proxy 4.1,因为不支持占位符传参,go工程想要用,就全得转换成完整SQL,但是配置比较简单,容易部署,有apache基金会支持,社区活跃

第3是kingshard,因为不支持占位符传参,就全得转换成完整SQL,并且github已经不更新了

测试结果日志

2025/04/19 17:04:24 shardingsphere-proxy test
2025/04/19 17:04:25 query 1 success, uid= 1119859588875681792
[mysql] 2025/04/19 17:04:25 packets.go:64 [warn] unexpected seq nr: expected 4, got 5
2025/04/19 17:04:25 query 2 fail 2: commands out of sync. You can't run this command now
[mysql] 2025/04/19 17:04:25 packets.go:64 [warn] unexpected seq nr: expected 8, got 17
2025/04/19 17:04:25 select result: null 2025/04/19 17:04:25 kingshard test
2025/04/19 17:04:25 query 1 success, uid= 4
2025/04/19 17:04:25 query 2 fail 2: Error 1105 (HY000): prepare error ERROR 1146 (42S02): Table 'sharding_user.t_user' doesn't exist
2025/04/19 17:04:25 Error 1105 (HY000): prepare error ERROR 1146 (42S02): Table 'sharding_user.t_user' doesn't exist 2025/04/19 17:04:25 gaea test
2025/04/19 17:04:25 query 1 fail 1: sql: no rows in result set
2025/04/19 17:04:25 query 2 fail 1: sql: no rows in result set
2025/04/19 17:04:25 insert RowsAffected 1
2025/04/19 17:04:25 select result: [{"created_time":"2025-04-19T00:51:23+08:00","update_time":"2025-04-19T00:51:23+08:00","id":1,"Email":"test@test.com","LoginName":"test1","Passwd":"","LoginStatus":0,"LastLoginTime":null,"LoginCount":0},{"created_time":"2025-04-19T16:47:56+08:00","update_time":"2025-04-19T16:47:56+08:00","id":4,"Email":"test@test.com","LoginName":"test4","Passwd":"","LoginStatus":0,"LastLoginTime":null,"LoginCount":0},{"created_time":"2025-04-19T16:48:05+08:00","update_time":"2025-04-19T16:48:05+08:00","id":7,"Email":"test@test.com","LoginName":"test7","Passwd":"","LoginStatus":0,"LastLoginTime":null,"LoginCount":0},{"created_time":"2025-04-19T17:04:25+08:00","update_time":"2025-04-19T17:04:25+08:00","id":8,"Email":"test@test.com","LoginName":"test8","Passwd":"","LoginStatus":0,"LastLoginTime":null,"LoginCount":0},{"created_time":"2025-04-19T16:45:56+08:00","update_time":"2025-04-19T16:45:56+08:00","id":9,"Email":"test@test.com","LoginName":"test9","Passwd":"","LoginStatus":0,"LastLoginTime":null,"LoginCount":0}]

Go工程选择开源分库分表中间件可用性测试的更多相关文章

  1. 当当开源sharding-jdbc,轻量级数据库分库分表中间件

    近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...

  2. 解读分库分表中间件Sharding-JDBC

    [编者按]数据库分库分表从互联网时代开启至今,一直是热门话题.在NoSQL横行的今天,关系型数据库凭借其稳定.查询灵活.兼容等特性,仍被大多数公司作为首选数据库.因此,合理采用分库分表技术应对海量数据 ...

  3. 支付宝分库分表中间件--zdal简介

    中间件, 如果仅仅作为一名用户的话, 主要关注一下如何使用即可, 大多数情况下也就是配置. 下面简单的介绍一下支付宝的分库分表中间件--->zdal在web项目中的配置. 1, 在网上查阅相关资 ...

  4. 分库分表中间件Sharding-JDBC

    数据库分库分表从互联网时代开启至今,一直是热门话题.在NoSQL横行的今天,关系型数据库凭借其稳定.查询灵活.兼容等特性,仍被大多数公司作为首选数据库.因此,合理采用分库分表技术应对海量数据和高并发对 ...

  5. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

  6. Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

    一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...

  7. 分库分表中间件sharding-jdbc的使用

    数据分片产生的背景,可以查看https://shardingsphere.apache.org/document/current/cn/features/sharding/,包括了垂直拆分和水平拆分的 ...

  8. sharding-jdbc,轻量级数据库分库分表中间件

    Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据库分库分表访问.Sharding-JDBC是继dubbox和ela ...

  9. 数据库分库分表中间件:Mycat;分布式数据库;mysql的分布式事务

    官网:http://mycat.io/,里面有电子书籍可以下载:http://www.mycat.io/document/mycat-definitive-guide.pdf 旧版本下载地址:http ...

  10. Mycat 数据库分库分表中间件

    http://www.mycat.io/ Mycat 国内最活跃的.性能最好的开源数据库中间件! 我们致力于开发高性能的开源中间件而努力! 实体书Mycat权威指南 »开源投票支持Mycat下载 »s ...

随机推荐

  1. HTTPS 证书自动化运维:告别手动管理,迎接自动化时代

    1. 引言 随着互联网的发展,网络安全变得越来越重要.HTTPS(Hypertext Transfer Protocol Secure)通过使用 SSL/TLS 协议加密数据传输,确保了用户与网站之间 ...

  2. nacos(二):原生java调用配置与服务实例

    本文主要介绍原生java连接nacos,操作nacos的共享配置与服务实例. 1.引入依赖 <dependencies> <dependency> <groupId> ...

  3. MySql中创建用户以及设置其操作权限

    以下设置针对MySql8+版本进行测试,低版本暂无测试. 以管理员身份CMD并定位到MySql安装的bin目录,然后执行命令mysql -u root -p登录到MySql,然后输入登录密码,登录成功 ...

  4. 2.vue3修改端口号

    根目录新建vue.vonfig.js module.exports = { devServer: { port: 8081, // 端口 }, lintOnSave: false // 取消 esli ...

  5. C盘扩展卷碰到的那些事-->不是同一块物理磁盘操作扩展卷是有坑的

    自己电脑上面用过win10系统资源管理器扩展卷的功能,用过几次都成功扩容了磁盘空间,简单说一下原理: 就是将剩余未分配的磁盘空间划给要扩展的磁盘. 这天公司的电脑C盘老是红色提示空间不足,那就扩充容量 ...

  6. 发那科FANUC机器人A06B-0652-B212电机维修基本流程

    发那科FANUC机器人以其卓越的性能和可靠性赢得了广泛的认可.然而,就像其他任何机械设备一样,长时间的运行和复杂的工作环境都可能使伺服电机面临维修的需求.为了确保您的发那科FANUC机器人A06B-0 ...

  7. 【攻防世界】warmup

    warmup (反序列化与sql注入) 题目来源 攻防世界 NO.GFSJ0999 题目描述 题目提示:平平无奇的输入框 打开网址页面如下,没有有用信息. 题目给了附件,直接下载,得到源码如下: in ...

  8. 基于 Trae Claude-3.7 从0到1 打造加密货币钱包Dompet-App

    从0到1:用Trae Claude-3.7打造加密货币钱包Dompet-App 项目介绍 大家好!今天我要分享如何使用强大的AI助手Trae Claude-3.7,从零开始构建一款功能丰富的加密货币钱 ...

  9. swoole(8)http服务

    简介: swoole内置实现了一个简单的httpServer类.swoole的http server相当于php-fpm.最大优势在于高性能,代码只载入一次 http_server本质是swoole_ ...

  10. python 二级 基本数据类型

    1.思维导图 需要特殊记忆知识点 -1.01E-3值为 0.00101 基本运算一共9个: 取整 a//b 取余数 a%b x的y次幂 :x**y 数值运算函数 format 格式的控制 常用的操作 ...