需要满足下面2条
1、 你想要最快的执行完,并且不在乎短期占用太多资源,能保证线程安全(比Task.Run 性能更快,也不需要考虑线程安全)
2、 数据库操作10个以上,如果只有几个数据库操作就没必要用了和一般的异步没多少区别
注意:每种数据库用法不一样
注意: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秒 |
注意用: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未测试
2016 © donet5.comApache Licence 2.0