发布1203
大石头 编写于 2019-12-03 22:57:54
X
using System;
using System.Collections.Generic;
using NewLife.Log;
using NewLife.Security;
using STOD.Entity;
using XCode;
using XCode.DataAccessLayer;

namespace SplitTableOrDatabase
{
    class Program
    {
        static void Main(String[] args)
        {
            XTrace.UseConsole();

            //TestByNumber();
            //TestByDate();
            SearchByDate();

            Console.WriteLine("OK!");
            Console.ReadLine();
        }

        static void TestByNumber()
        {
            XTrace.WriteLine("按数字分表分库");

            // 预先准备好各个库的连接字符串,动态增加,也可以在配置文件写好
            for (var i = 0; i < 4; i++)
            {
                var connName = $"HDB_{i + 1}";
                DAL.AddConnStr(connName, $"data source=numberData\\{connName}.db", null, "sqlite");

                // 每库建立4张表。这一步不是必须的,首次读写数据时也会创建
                //History.Meta.ConnName = connName;
                //for (var j = 0; j < 4; j++)
                //{
                //    History.Meta.TableName = $"History_{j + 1}";

                //    // 初始化数据表
                //    History.Meta.Session.InitData();
                //}
            }

            //!!! 写入数据测试

            // 4个库
            for (var i = 0; i < 4; i++)
            {
                var connName = $"HDB_{i + 1}";
                History.Meta.ConnName = connName;

                // 每库4张表
                for (var j = 0; j < 4; j++)
                {
                    History.Meta.TableName = $"History_{j + 1}";

                    // 插入一批数据
                    var list = new List<History>();
                    for (var n = 0; n < 1000; n++)
                    {
                        var entity = new History
                        {
                            Category = "交易",
                            Action = "转账",
                            CreateUserID = 1234,
                            CreateTime = DateTime.Now,
                            Remark = $"[{Rand.NextString(6)}]向[{Rand.NextString(6)}]转账[¥{Rand.Next(1_000_000) / 100d}]"
                        };

                        list.Add(entity);
                    }

                    // 批量插入。两种写法等价
                    //list.BatchInsert();
                    list.Insert(true);
                }
            }
        }

        static void TestByDate()
        {
            XTrace.WriteLine("按时间分表分库,每月一个库,每天一张表");

            // 预先准备好各个库的连接字符串,动态增加,也可以在配置文件写好
            var start = DateTime.Today;
            for (var i = 0; i < 12; i++)
            {
                var dt = new DateTime(start.Year, i + 1, 1);
                var connName = $"HDB_{dt:yyMM}";
                DAL.AddConnStr(connName, $"data source=timeData\\{connName}.db", null, "sqlite");
            }

            // 每月一个库,每天一张表
            start = new DateTime(start.Year, 1, 1);
            for (var i = 0; i < 365; i++)
            {
                var dt = start.AddDays(i);
                History.Meta.ConnName = $"HDB_{dt:yyMM}";
                History.Meta.TableName = $"History_{dt:yyMMdd}";

                // 插入一批数据
                var list = new List<History>();
                for (var n = 0; n < 1000; n++)
                {
                    var entity = new History
                    {
                        Category = "交易",
                        Action = "转账",
                        CreateUserID = 1234,
                        CreateTime = DateTime.Now,
                        Remark = $"[{Rand.NextString(6)}]向[{Rand.NextString(6)}]转账[¥{Rand.Next(1_000_000) / 100d}]"
                    };

                    list.Add(entity);
                }

                // 批量插入。两种写法等价
                //list.BatchInsert();
                list.Insert(true);
            }
        }

        static void SearchByDate()
        {
            // 预先准备好各个库的连接字符串,动态增加,也可以在配置文件写好
            var start = DateTime.Today;
            for (var i = 0; i < 12; i++)
            {
                var dt = new DateTime(start.Year, i + 1, 1);
                var connName = $"HDB_{dt:yyMM}";
                DAL.AddConnStr(connName, $"data source=timeData\\{connName}.db", null, "sqlite");
            }

            // 随机日期。批量操作
            start = new DateTime(start.Year, 1, 1);
            {
                var dt = start.AddDays(Rand.Next(0, 365));
                XTrace.WriteLine("查询日期:{0}", dt);

                History.Meta.ConnName = $"HDB_{dt:yyMM}";
                History.Meta.TableName = $"History_{dt:yyMMdd}";

                var list = History.FindAll();
                XTrace.WriteLine("数据:{0}", list.Count);
            }

            // 随机日期。个例操作
            start = new DateTime(start.Year, 1, 1);
            {
                var dt = start.AddDays(Rand.Next(0, 365));
                XTrace.WriteLine("查询日期:{0}", dt);
                var list = History.Meta.ProcessWithSplit(
                    $"HDB_{dt:yyMM}",
                    $"History_{dt:yyMMdd}",
                    () => History.FindAll());

                XTrace.WriteLine("数据:{0}", list.Count);
            }
        }
    }
}