SmartSql = MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......


概要


SmartSql-Starter

0. Why

  • プラットフォームにまたがるDotNet Coreを抱擁するのは、時間です.
  • 高性能、高生産性、史上最軽量級のORM.107kb

  • 1. So SmartSql

  • TargetFrameworks: .NETFramework 4.6 & .NETStandard 2.0
  • SmartSql = MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ……

  • 2.主な特性(√は完了、√は計画特性)

  • 1 ORM
  • 1.1 Sync
  • 1.2 Async

  • 2 XmlConfig & XmlStatement -> Sql
  • 2.1 SmartSqlMapConfig&SmartSqlMap√(はい、当てました.MyBatisと同じように、XML構成でSQLを分離します.)
  • .2 Config Hot Update->ConfigWatcher&Reload(プロファイルのホットアップデート:Sqlを変更する必要がある場合は、直接SqlMapプロファイルを変更して保存すればよい.)

  • 3読み書き分離√
  • 3.1読み書き分離√
  • 3.2マルチライブラリウェイトフィルタ√(マルチライブラリを構成し、ライブラリウェイトに基づいてライブラリを選択)
  • 4ログ√
  • 4.1 Microsoftに基づく.Extensions.Logging.Abstraactions(デバッグを追跡する必要がある場合はすべてが一目瞭然)
  • 5 Dynamic Repository
  • 5.1 SmartSql.DyRepository√(両手を解放し、倉庫インタフェースを定義し、データベースアクセスを実現します)
  • 6クエリーキャッシュ√(ホットデータキャッシュ、構成が簡単)
  • 6.1 SmartSql.Cache.Memory √
  • 6.1.1 Fifo √
  • 6.1.2 Lru √
  • 6.2 SmartSql.Cache.Redis √
  • 6.3キャッシュ・トランザクションの一貫性
  • 7分散構成プラグイン
  • 7.1 IConfigLoader√(プロファイル・ローダ)
  • 7.2 LocalFileConfigLoader√(ローカルファイル構成ローダ)
  • 7.2.1 Load SmartSqlMapSource Xml √
  • 7.3.1 Load SmartSqlMapSource Directory √
  • 7.3 SmartSql.ZooKeeperConfig√(ZooKeeper分散プロファイルローダ)

  • 3.性能

    
    BenchmarkDotNet=v0.10.14, OS=Windows 10.0.16299.431 (1709/FallCreatorsUpdate/Redstone3)
    Intel Core i7-4710MQ CPU 2.50GHz (Haswell), 1 CPU, 8 logical and 4 physical cores
    Frequency=2435768 Hz, Resolution=410.5481 ns, Timer=TSC
    .NET Core SDK=2.1.201
      [Host]     : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
      DefaultJob : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
    


    ORM
    Type
    Method
    Mean
    Error
    StdDev
    Rank
    Gen 0
    Gen 1
    Gen 2
    Allocated
    SmartSql
    SmartSqlBenchmarks
    Query
    101.6 ms
    0.2226 ms
    0.1738 ms
    1
    2437.5000
    1062.5000
    375.0000
    13.37 MB
    Native
    NativeBenchmarks
    Query_IsDBNull_GetValue
    101.7 ms
    0.4101 ms
    0.3635 ms
    1
    2437.5000
    1062.5000
    375.0000
    13.37 MB
    Dapper
    DapperBenchmarks
    Query
    104.4 ms
    1.3195 ms
    1.2342 ms
    2
    3375.0000
    1375.0000
    625.0000
    17.64 MB
    SmartSqlDapper
    SmartSqlDapperBenchmarks
    Query
    105.7 ms
    1.1697 ms
    1.0941 ms
    3
    3750.0000
    1437.5000
    625.0000
    19.47 MB
    Native
    NativeBenchmarks
    Query_GetValue_DbNull
    107.4 ms
    1.0710 ms
    1.0018 ms
    4
    3062.5000
    1187.5000
    500.0000
    16.42 MB
    SqlSugar
    SqlSugarBenchmarks
    Query
    108.9 ms
    0.4048 ms
    0.3787 ms
    5
    2375.0000
    1000.0000
    312.5000
    13.09 MB
    EF
    EFBenchmarks
    SqlQuery
    110.9 ms
    0.6922 ms
    0.6475 ms
    6
    11062.5000
    -
    -
    34.13 MB
    Chloe
    ChloeBenchmarks
    Query
    14.5 ms
    2.2600 ms
    5.3711 ms
    7
    2375.0000
    1000.0000
    312.5000
    13.07 MB
    EF
    EFBenchmarks
    Query_NoTracking
    126.4 ms
    1.3197 ms
    1.2344 ms
    8
    5937.5000
    2250.0000
    1062.5000
    30.16 MB
    EF
    EFBenchmarks
    SqlQuery_NoTracking
    148.6 ms
    0.8290 ms
    0.7755 ms
    9
    7437.5000
    2937.5000
    1250.0000
    37.79 MB

    4.インストール(NuGet)

    Install-Package SmartSql

    5.一般コード


    検索

                ISmartSqlMapper SqlMapper = MapperContainer.Instance.GetSqlMapper();
                SqlMapper.Query(new RequestContext
                {
                    Scope = "T_Test",
                    SqlId = "GetList",
                    Request = new { Ids = new long[] { 1, 2, 3, 4 } }
                });

    取引

                try
                {
                    ISmartSqlMapper SqlMapper = MapperContainer.Instance.GetSqlMapper();
                    SqlMapper.BeginTransaction();
                    //BizCode
                    SqlMapper.CommitTransaction();
                }
                catch (Exception ex)
                {
                    SqlMapper.RollbackTransaction();
                    throw ex;
                }

    6.ベストプラクティス


    6.1 SmartSqlをインストールする.DIExtension

    Install-Package SmartSql.DIExtension

    6.2注入依存

     services.AddSmartSql();
     services.AddRepositoryFactory();
     services.AddRepositoryFromAssembly((options) =>
     {
        options.AssemblyString = "SmartSql.Starter.Repository";
     });

    6.3倉庫インタフェースの定義

        /// 
        ///     : [SqlMap(Scope = "User")] ,        Scope   :I{Scope}Repository
        ///         
        /// RepositoryBuilder builder=new RepositoryBuilder("I{Scope}DAL");
        /// 
        public interface IUserRepository
        {
            /// 
            ///      [Statement(Execute = ExecuteBehavior.Auto,Id = "Query")]
            ///    Execute:Auto ,         
            ///    Id :    
            /// 
            /// 
            /// 
            IEnumerable Query(object reqParams);
            long GetRecord(object reqParams);
            User Get(object reqParams);
            long Insert(User entity);
            int Update(User entity);
            int Delete(User enttiy);
        }

    6.4思う存分楽しむ

        public class UserService
        {
            private readonly ISmartSqlMapper _smartSqlMapper;
            private readonly IUserRepository _userRepository;
    
            public UserService(
                 ISmartSqlMapper smartSqlMapper
                , IUserRepository userRepository)
            {
                _smartSqlMapper = smartSqlMapper;
                _userRepository = userRepository;
            }
    
            public long Add(AddRequest request)
            {
                int existsNum = _userRepository.Exists(new { request.UserName });
                if (existsNum > 0)
                {
                    throw new ArgumentException($"{nameof(request.UserName)} has already existed!");
                }
                return _userRepository.Add(new Entitiy.User
                {
                    UserName = request.UserName,
                    Password = request.Password,
                    Status = Entitiy.UserStatus.Ok,
                    CreationTime = DateTime.Now,
                });
            }
    
            public void UseTransaction()
            {
                try
                {
                    _smartSqlMapper.BeginTransaction();
                    //Biz();
                    _smartSqlMapper.CommitTransaction();
                }
                catch (Exception ex)
                {
                    _smartSqlMapper.RollbackTransaction();
                    throw ex;
                }
            }
        }

    7.文書アドレス

  • オンラインアドレス
  • PDF
  • Mobi
  • ePub

  • 8.技術交流


    リンクをクリックしてQQ群【SmartSql公式交流群】:604762592