近期在寻找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. 链路状态路由协议OSPF-02

    路由信息传递与路由计算分离. 基于SPF算法. 以"累计链路开销"作为选路参考值. 所谓Link State(链路状态)指的就是路由器的接口状态.在OSPF中路由器的某一接口的链路 ...

  2. VS Code 开发工具的基本使用

    VS Code 开发工具的基本使用 VS Code(Visual Studio Code)是微软开发的一款免费.开源的代码编辑器,它支持多种操作系统,包括Windows.macOS和Linux.VS ...

  3. NET中三种主机简单理解

    在NET中有三个不同的主机: .NET WebApplication 主机,也称为最小主机. 这是.NET 6中的一个新特性,旨在提供最小的启动时间和内存消耗.最小主机只包括.NET运行时的最基本组件 ...

  4. Nginx 拒绝错误SNI请求以防止源站被扫描

    Nginx 1.19.4 版本更新了一个新的配置,允许使用 ssl_reject_handshake 这个参数来拒绝错误 SNI 请求的握手,可以防止被类似Censys互联网扫码工具扫描出源站ip 在 ...

  5. NetPad:一个.NET开源、跨平台的C#编辑器

    前言 今天大姚给大家分享一个基于.NET开源.跨平台的C#编辑器和游乐场:NetPad. 项目介绍 NetPad是一个基于.NET开源(MIT License).跨平台的C#编辑器和游乐场,它允许用户 ...

  6. Linux - 内核版本升级

    测试时间:2024年5月15日,本文测试CentOS7.9的内核版本升级 测试结论:不要选择手动编译的方式!!! 一.使用第三方仓库(ELRepo) (1)升级前内核查看(3.10.0-1160.el ...

  7. Chrome打开知乎报ERR_HTTP2_PROTOCOL_ERROR错误的问题

    打开 chrome://flags/ 页面 找到 Block insecure private network requests. 和 Enable Trust Tokens 两项 将其值从 Defa ...

  8. windows在Apple Developer创建打包证书的简单教程

    在uniapp上做ios开发,其开发证书必须在Apple Developer(苹果开发者中心)上使用自己个人或自己公司的开发者账号,创建打包的证书,然后上架的时候使用同一个账号上架Apple Deve ...

  9. nuxtjs 自定义服务端错误页面 Server error page

    原文链接:https://blog.jijian.link/2020-12-03/nuxtjs-server-error-page/ 当 nuxt 项目在生产环境运行时,如果服务端运行出错,比如 as ...

  10. websocket 后台新订单通知 —— Laravel 5.8 Laravel-echo-server教程

    websocket 后台新订单通知 -- Laravel 5.8 workman PHPSocket.IO教程 环境要求: Laravel 框架 (5.8 版本) Redis 服务 1.安装 lara ...