数据库异步并发执行

适用场景

需要满足下面2条 

1、 你想要最快的执行完,并且不在乎短期占用太多资源,能保证线程安全(比Task.Run 性能更快,也不需要考虑线程安全)

2、 数据库操作10个以上,如果只有几个数据库操作就没必要用了和一般的异步没多少区别

注意:每种数据库用法不一样 


1、SqlServer | Sqlite | Oracle  

注意:1、异步方法   Task.WhenAll

          2、db是同一个,并且用事务

          3、SqlServer需要连接字符串加上 MultipleActiveResultSets=True  


下面是一个完整的用例并且测试通过

using System.Linq;
using System.Threading.Tasks;

namespace OrmTest
{
    class Program
    {
        static async Task Main(string[] args)

        {

            int max = 1000;

            Task[] tasks = new Task[max];

            var db = GetClient();//db需要是同一个
            db.BeginTran(); //强制关闭自动释放(如果手动释放可以不用事务)
            

            for (int i = 0; i < max; i++)

            {
      


                tasks[i] = db.Queryable<Order>().Take(10)
                    .ToListAsync();

            }

            await Task.WhenAll(tasks);
            db.CommitTran(); //关闭数据库
        }

        private static SqlSugarClient GetClient()  //SqlSugarClient和SqlSugarScope都行
        {
            return new SqlSugarClient(new ConnectionConfig()
            {
                DbType = SqlSugar.DbType.SqlServer, //SqlServer Sqlite Oracle
                //注意配置
                ConnectionString = OrmTest.Config.ConnectionString,
                IsAutoCloseConnection = true,
                AopEvents = new AopEvents
                {
                    OnLogExecuting = (sql, p) =>
                    {
                        Console.WriteLine(sql);
                        Console.WriteLine(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value)));
                    }
                }
            });
        }
    }
}


测试结果

本身IIS就是多线程操作,所以不是特殊需求没必要并发查询,并发查询会把数据库的IO充份利用,并且可以保证线程安全,

配置 1165G7 SSD  结果

Task.WhenAll

1000个1秒   
Task.Run(()=>{ var db=new  sqlsugarclient(); db.xxx})1000就10秒 



2、PGSQL | MySql

注意用:SqlSugarClient 和 SqlSugarScope用法不一样

PGSql MYSQL和上面用法不同 ,需要用 SqlSugarClient  new的方式实现性能最佳 

using SqlSugar;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace OrmTest
{
    class Program
    {
        static async Task Main(string[] args)

        {

            int max = 1000;

            Task[] tasks = new Task[max];

        

            for (int i = 0; i < max; i++)

            {
                //用SqlSugarClient 
                var db = GetClient();//db需要new出来不能是同一个和SqlServer相反
                                        
                 //用SqlSugarScope 需要转成 SqlSugarClient
                 //var db = new SqlSugarClient(SqlSugarScopeDb.CurrentConnectionConfig); 

                tasks[i] = db.Queryable<Order>().Take(10) 
                    .ToListAsync();

            }

            await Task.WhenAll(tasks);
           
        }

        private static SqlSugarClient GetClient()
        {
            return new SqlSugarClient(new ConnectionConfig()
            {
                DbType = SqlSugar.DbType.PostgreSQL,//或者MySql
                ConnectionString =OrmTest.Config.ConnectionString,
                IsAutoCloseConnection = true, //自动释放
                AopEvents = new AopEvents
                {
                    OnLogExecuting = (sql, p) =>
                    {
                        Console.WriteLine(sql);
                        Console.WriteLine(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value)));
                    }
                }
            });
        }
    }
}

总结:MySql PgSql虽然性能上去了,不过事务不能用了,所以异步并发上SqlServer Sqlite Oracle支持的相对好一些

高版本:MYSQL PGSQL未测试

文档:SqlSugar5.0