mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-01 00:05:28 +08:00 
			
		
		
		
	- 修复 UseSlaveWeight 异步下可能无效的问题;#1382
This commit is contained in:
		| @@ -800,14 +800,5 @@ | ||||
|             <param name="that"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])"> | ||||
|             <summary> | ||||
|             批量注入 Repository,可以参考代码自行调整 | ||||
|             </summary> | ||||
|             <param name="services"></param> | ||||
|             <param name="globalDataFilter"></param> | ||||
|             <param name="assemblies"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
|   | ||||
| @@ -3335,177 +3335,6 @@ | ||||
|             <param name="parms"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteConnectTestAsync(System.Int32,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             测试数据库是否连接正确,本方法执行如下命令:<para></para> | ||||
|             MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1<para></para> | ||||
|             Oracle: SELECT 1 FROM dual<para></para> | ||||
|             </summary> | ||||
|             <param name="commandTimeout">命令超时设置(秒)</param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns>true: 成功, false: 失败</returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 | ||||
|             </summary> | ||||
|             <param name="readerHander"></param> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <param name="readerHander"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询 | ||||
|             </summary> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询 | ||||
|             </summary> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询 | ||||
|             </summary> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             在【主库】执行 | ||||
|             </summary> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             在【主库】执行 | ||||
|             </summary> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) | ||||
|             </summary> | ||||
|             <typeparam name="T"></typeparam> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <typeparam name="T"></typeparam> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[],System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) | ||||
|             </summary> | ||||
|             <typeparam name="T1"></typeparam> | ||||
|             <typeparam name="T2"></typeparam> | ||||
|             <param name="cmdType"></param> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="cmdParms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 })<para></para> | ||||
|             提示:parms 参数还可以传 Dictionary<string, object> | ||||
|             </summary> | ||||
|             <typeparam name="T1"></typeparam> | ||||
|             <typeparam name="T2"></typeparam> | ||||
|             <param name="cmdText"></param> | ||||
|             <param name="parms"></param> | ||||
|             <param name="cancellationToken"></param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="E:FreeSql.IAop.ParseExpression"> | ||||
|             <summary> | ||||
|             可自定义解析表达式 | ||||
| @@ -4496,12 +4325,6 @@ | ||||
|             <param name="timeout">超时</param> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.GetAsync"> | ||||
|             <summary> | ||||
|             获取资源 | ||||
|             </summary> | ||||
|             <returns></returns> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)"> | ||||
|             <summary> | ||||
|             使用完毕后,归还资源 | ||||
| @@ -4577,12 +4400,6 @@ | ||||
|             </summary> | ||||
|             <param name="obj">资源对象</param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGetAsync(FreeSql.Internal.ObjectPool.Object{`0})"> | ||||
|             <summary> | ||||
|             从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 | ||||
|             </summary> | ||||
|             <param name="obj">资源对象</param> | ||||
|         </member> | ||||
|         <member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})"> | ||||
|             <summary> | ||||
|             归还对象给对象池的时候触发 | ||||
|   | ||||
| @@ -12,7 +12,7 @@ public static class FreeUtil | ||||
| { | ||||
|  | ||||
|     private static DateTime dt1970 = new DateTime(1970, 1, 1); | ||||
|     private static ThreadLocal<Random> rnd = new ThreadLocal<Random>(() => new Random()); | ||||
|     internal static ThreadLocal<Random> rnd = new ThreadLocal<Random>(() => new Random()); | ||||
|     private static readonly int __staticMachine = ((0x00ffffff & Environment.MachineName.GetHashCode()) + | ||||
| #if NETSTANDARD1_5 || NETSTANDARD1_6 | ||||
| 			1 | ||||
|   | ||||
| @@ -33,7 +33,6 @@ namespace FreeSql.Internal.CommonProvider | ||||
|         public CommonUtils _util { get; set; } | ||||
|         protected int slaveUnavailables = 0; | ||||
|         private object slaveLock = new object(); | ||||
|         private Random slaveRandom = new Random(); | ||||
|         protected Func<DbTransaction> ResolveTransaction; | ||||
|  | ||||
|         public AdoProvider(DataType dataType, string connectionString, string[] slaveConnectionStrings) | ||||
| @@ -584,7 +583,7 @@ namespace FreeSql.Internal.CommonProvider | ||||
|                         if (availables.Count == 1) pool = availables[0]; | ||||
|                         else | ||||
|                         { | ||||
|                             var rnd = slaveRandom.Next(availables.Sum(a => a.Policy.Weight)); | ||||
|                             var rnd = FreeUtil.rnd.Value.Next(availables.Sum(a => a.Policy.Weight)); | ||||
|                             for(var a = 0; a < availables.Count; a++) | ||||
|                             { | ||||
|                                 rnd -= availables[a].Policy.Weight; | ||||
|   | ||||
| @@ -501,7 +501,20 @@ namespace FreeSql.Internal.CommonProvider | ||||
|                     if (availables.Any()) | ||||
|                     { | ||||
|                         isSlave = true; | ||||
|                         pool = availables.Count == 1 ? this.SlavePools[0] : availables[slaveRandom.Next(availables.Count)]; | ||||
|                         if (availables.Count == 1) pool = availables[0]; | ||||
|                         else | ||||
|                         { | ||||
|                             var rnd = FreeUtil.rnd.Value.Next(availables.Sum(a => a.Policy.Weight)); | ||||
|                             for (var a = 0; a < availables.Count; a++) | ||||
|                             { | ||||
|                                 rnd -= availables[a].Policy.Weight; | ||||
|                                 if (rnd < 0) | ||||
|                                 { | ||||
|                                     pool = availables[a]; | ||||
|                                     break; | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 2881099
					2881099