近期在寻找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. LeetCode刷题:AddressSanitizer: heap-buffer-overflow问题请教||全局变量和引用传递的区别

    在刷 https://leetcode.cn/problems/sudoku-solver/description/ 遇到AddressSanitizer: heap-buffer-overflow的 ...

  2. obsidian双向链接 不可链接到其他文章的段落|片段 解决方案

    前言 今天发现obsidian只能链接到其他文章的标题,不能链接到片段 一个简单的语法体现事物的普遍联系!|Obsidian知识管理 #2 双向链接|高级玩家_锌一(Strik0r)_哔哩哔哩_bil ...

  3. legged-robot关于locomotion、Navigation任务主要文章速览

    0. 前言 目前legged robot包括locomotion(怎么走).navigation(往哪走).人形机器人的whole body control以及基于机械臂的manipulation的任 ...

  4. react事件 报错Cannot read property 'setState' of undefined

    import React, { Component } from "react"; export class TestHanderClick extends Component { ...

  5. 在SOUI4中使用非客户区自绘

    前段时间用sdl嵌入SOUI做视频播放器,由于SOUI习惯屏蔽系统默认的非客户区,而在窗口自己的客户区分出一块来模拟非客户区,导致窗口在拉伸的时候,SOUI窗口会出现比较严重的闪烁(不光是SOUI这样 ...

  6. Windows中GNURadio的安装

    对于一个常常使用Python的人来讲(此处指我),conda环境是必不可少的,(Anaconda或Miniconda). 在Windows中且已经安装过conda环境的情况下,安装GNURadio特别 ...

  7. Spring Boot项目设置跨域

    一.跨域设置 新建一个配置类 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterC ...

  8. Ubuntu Linux部署DeepSeek(转载用于学习)

    合集 - DeepSeek(4) 1.Ubuntu Linux部署DeepSeek02-06 2.Windows11本地部署DeepSeek加速02-073.DeepSeek部署本地知识库02-084 ...

  9. salesforce零基础学习(一百四十三)零碎知识点小总结(十一)

    本篇参考: https://help.salesforce.com/s/articleView?id=release-notes.rn_lab_dynamic_highlights_panel.htm ...

  10. 多项式算法初探:从 FFT 到 NTT

    注:由于发现 FWT 解决的问题和 FFT,NTT 差别有点大,加之 FMT 的存在,本文就只解决 FFT 和 NTT,剩下两个放在别的算法总结里讲. 多项式一向是算法竞赛中相当博大精深的东西,作为一 ...