示例#1
0
 public StorageConfig(string conn, string eventTable, string snapshotTable, bool isFollow = false, string followName = null, bool sharding = true, int shardingDays = 40, int stateIdLength = 200)
 {
     Connection      = conn;
     EventTable      = eventTable;
     SnapshotTable   = snapshotTable;
     FollowName      = followName;
     this.sharding   = sharding;
     IsFollow        = isFollow;
     shardingMinutes = shardingDays * 24 * 60;
     StateIdLength   = stateIdLength;
     TableRepository = new TableRepository(this);
 }
示例#2
0
        public async ValueTask <TableInfo> GetTable(long eventTimestamp)
        {
            var firstTable = AllSplitTableList.FirstOrDefault();

            //如果不需要分表,直接返回
            if (firstTable != null && !sharding)
            {
                return(firstTable);
            }
            var nowUtcTime  = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            var subMinutes  = (eventTimestamp - (firstTable != null ? firstTable.CreateTime : nowUtcTime)) / (60 * 1000);
            var version     = subMinutes > 0 ? (int)(subMinutes / shardingMinutes) : 0;
            var resultTable = AllSplitTableList.FirstOrDefault(t => t.Version == version);

            if (resultTable == default)
            {
                var table = new TableInfo
                {
                    Version    = version,
                    Prefix     = EventTable,
                    CreateTime = nowUtcTime,
                    Name       = EventTable + "_" + version
                };
                try
                {
                    await TableRepository.CreateEventTable(table);

                    AllSplitTableList.Add(table);
                    resultTable = table;
                }
                catch (Exception ex)
                {
                    AllSplitTableList = await TableRepository.GetTableListFromDb();

                    if (ex is Npgsql.PostgresException e && e.SqlState != "42P07" && e.SqlState != "23505")
                    {
                        throw;
                    }
                    resultTable = AllSplitTableList.First(t => t.Version == version);
                }
            }
            return(resultTable);
        }