golangmysql可扩展分表代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golangmysql可扩展分表代码相关的知识,希望对你有一定的参考价值。

参考技术A go-mysql-server是一个SQL引擎,能解析标准SQL(基于MySQL语法)并优化查询。它提供了简单的接口,允许自定义表格数据源实现。提供与MySQL协议兼容的服务器实现。这意味着它与MySQLODBC,JDBC或默认的MySQL客户端shell接口兼容。
如果写压力进一步扩大,并且数据量急剧快速增长,DB写节点即主库就会成为整个系统的瓶颈。在mysql的日常运营中,如果DB中表和表之间的数据很多是没有关系的,或者根本不需要表关联Join操作,我们可以考虑按照业务把不同的数据放到不同的服务器中,即垂直分库或叫垂直切分。
不过需要注意的是,垂直分库无法解决单表数据量过大的问题,由于单一业务的数据信息仍然落盘在单表中,如果单表数据量太大,就会极大地影响SQL执行的性能。由此,在MySQL应用领域,水平分表也是互联网场景应对高并发、单表数据量过大的解决方案之一。分表在本质上可以概括为业务表在逻辑上公用一个路由结构,物理上分散存储。这就是常说的Sharding分片或者分区。

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体基础

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.

文档地址: https://liningit.github.io/LnskyDB/

开源地址: https://github.com/liningit/LnskyDB

nuget地址: https://www.nuget.org/packages/LnskyDB/


前面我们介绍了LnskyDB的增删改查操作,接下来我们结束几个基础类.仓储及实体类还有T4如何生成实体

仓储

仓储的获取有两种方式一种是调用RepositoryFactory.Create<T>()方法创建,还有一种是创建仓储类继承Repository<T>.如果需要接口也可以创建接口继承IRepository<T>.
仓储中的CommandTimeout可以设置查询超时时间

实体类

创建实体类需继承BaseDBModel,并且实现里面的抽象方法

1.主键配置

GetDBModel_PKCols()返回表的主键名称,必须. 示例:

private static ImmutableList<string> _DBModel_PKCols = ImmutableList.Create("SysNo");
public override ImmutableList<string> GetDBModel_PKCols() => _DBModel_PKCols; 

2.自增列配置

GetDBModel_IncrementCol(); SetIncrementValue(int value)返回表的自增列,以及设置自增列值,如有自增列则必须. 示例:

public override string GetDBModel_IncrementCol() => "Id";
public override void SetIncrementValue(int value)
{
    Id = value;
}

3.库名表名配置

GetDBModel_TableName() GetDBModel_DBName()返回表名及库名,必须.如果是分库分表则后面待{0}.示例:

public override string GetDBModel_TableName() => "Purify_ProductSaleByDay{0}";
public override string GetDBModel_DBName() => "Lnsky{0}";

4.分库分表配置

GetShuffledModel()SetShuffledData(object obj)返回分库分表对象,及实现设置分库分表值.示例:

public override ShuffledModel GetShuffledModel()
{
    if (DBModel_ShuffledTempDate == DateTime.MinValue)
    {
        throw new NoShuffledException(GetDBModel_TableName(), "分库分表时间,ShuffledTempDate");
    }
    return ShuffledByDbTable(DBModel_ShuffledTempDate);
}
DateTime _DBModel_ShuffledTempDate;
[JsonIgnore]
public DateTime DBModel_ShuffledTempDate { get { return StatisticalDate != DateTime.MinValue ? StatisticalDate : _DBModel_ShuffledTempDate; } set { _DBModel_ShuffledTempDate = value; } }

public override void SetShuffledData(object obj) { DBModel_ShuffledTempDate = (DateTime)obj; }

错误日志

DBTool.Error事件,当执行sql发生异常会触发DBTool.Error事件

T4模版生成

项目‘LnskyDB.Demo‘中的T4目录下有T4自动生成实体类的代码.大家可以根据自己的实际情况进行修改配置
‘DbHelper.ttinclude‘中的‘Config.DbConfigs‘是用来编写生成配置的

  1. ConnectionString表示连接字符串
  2. Database是表示数据库实际名称
  3. DatabaseName是表示存储在‘appsettings.json‘中的名称
  4. TableNames表示要生成那些表表示全部Name_表示前缀是Name_的
  5. ExcludeTableName表示要排除那些表
  6. ShuffledConfigs表示分库分表配置存储表名,ShuffledConfig的键值对形式
  7. ShuffledConfig分库分表具体配置ShuffledData根据那一列分库分表,MinShuffledTempDate表示最小值

‘Entity.tt‘是生成实体,仓储及仓储接口的实际代码.大家可以根据自己项目的实际情况修改

 

程序员工具站点:草根工具www.idevtool.com  

个人笔记站点:草根笔记note.idevtool.com

 

以上是关于golangmysql可扩展分表代码的主要内容,如果未能解决你的问题,请参考以下文章

架构实践什么是架构可扩展立方体 (Scale Cube)?

TribeDB — Node.js 的 MySQL 分表分库访问中间件(牛逼!)

初识数据库分库分表框架Dbsplit

实现可扩展代码的四步曲

实现代码可扩展的另一个示例

具有可扩展行的可排序表