diff --git a/Directory.Build.props b/Directory.Build.props index b403c301..606f0874 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -9,7 +9,7 @@ - 3.2.661 + 3.2.666-preview202200601 diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 93e33c56..59d4b7df 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -283,6 +283,8 @@ namespace base_entity //.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) + .UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user;poolsize=5;min pool size=1") + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2") diff --git a/Examples/base_entity/base_entity.csproj b/Examples/base_entity/base_entity.csproj index 6f286bbd..607454c4 100644 --- a/Examples/base_entity/base_entity.csproj +++ b/Examples/base_entity/base_entity.csproj @@ -22,6 +22,7 @@ + @@ -30,5 +31,10 @@ - + + + + ..\..\Providers\FreeSql.Provider.Dameng\lib\DmProvider\netstandard2.0\DmProvider.dll + + diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 6b638cad..1ab5bf1c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -795,5 +795,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 2e1300c0..95e009ad 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using System.Text; using Xunit; using FreeSql.Internal.CommonProvider; +using System.Collections.ObjectModel; namespace FreeSql.Tests.Sqlite { @@ -1241,7 +1242,7 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title"" public string m2setting { get; set; } - public List childs { get; set; } + public ObservableCollection childs { get; set; } } public class TestInclude_OneToManyModel3 { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 1146d0b3..ba077fc1 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Data.Common; using System.Globalization; using System.Linq; @@ -395,7 +396,10 @@ namespace FreeSql.Internal object ret; if (string.IsNullOrEmpty(parent.IncludeManyKey) == false) { - ret = typeof(List<>).MakeGenericType(parent.CsType).CreateInstanceGetDefaultValue(); + if (parent.MapType == typeof(ObservableCollection<>).MakeGenericType(parent.CsType)) + ret = parent.MapType.CreateInstanceGetDefaultValue(); + else + ret = typeof(List<>).MakeGenericType(parent.CsType).CreateInstanceGetDefaultValue(); fillIncludeMany?.Add(NativeTuple.Create(parent.IncludeManyKey, ret as IList, rowIndex)); } else if (parent.SubSelectMany != null) @@ -408,6 +412,7 @@ namespace FreeSql.Internal else { var ctorParms = new object[ctorParmsLength]; + var ctorParmsDefs = parent.Consturctor.GetParameters(); for (var c = 0; c < ctorParmsLength; c++) ctorParms[c] = ReadAnonymous(parent.Childs[c], dr, ref index, notRead, null, rowIndex, fillIncludeMany, fillSubSelectMany); ret = parent.Consturctor.Invoke(ctorParms); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 10412d06..e28b43d1 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -671,17 +671,20 @@ namespace FreeSql.Internal.CommonProvider var listValueExp = Expression.Parameter(typeof(List), "listValue"); var setListValue = membersExpNotNull == null ? Expression.Lambda>>( - Expression.Assign( - Expression.MakeMemberAccess(membersExp, collMem.Member), - Expression.TypeAs(listValueExp, collMem.Type) - ), t1parm, listValueExp).Compile() : - Expression.Lambda>>( - Expression.IfThen( - membersExpNotNull, - Expression.Assign( - Expression.MakeMemberAccess(membersExp, collMem.Member), - Expression.TypeAs(listValueExp, collMem.Type) - ) + collMem.Type == typeof(ObservableCollection) ? + (Expression)Expression.IfThen( + Expression.NotEqual(listValueExp, Expression.Constant(null, typeof(List))), + Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.New(typeof(ObservableCollection).GetConstructor(new[] { typeof(List) }), listValueExp)) + ) : + Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.TypeAs(listValueExp, collMem.Type)) + , t1parm, listValueExp).Compile() : + Expression.Lambda>>(Expression.IfThen(membersExpNotNull, + collMem.Type == typeof(ObservableCollection) ? + (Expression)Expression.IfThen( + Expression.NotEqual(listValueExp, Expression.Constant(null, typeof(List))), + Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.New(typeof(ObservableCollection).GetConstructor(new[] { typeof(List) }), listValueExp)) + ) : + Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.TypeAs(listValueExp, collMem.Type)) ), t1parm, listValueExp).Compile(); var returnTarget = Expression.Label(typeof(object)); diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs index 12416f36..d8c0b2a7 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseConnectionPool.cs @@ -76,18 +76,17 @@ namespace FreeSql.ClickHouse { _connectionString = value ?? ""; - //var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - //var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - //if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; - //var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); - //PoolSize = poolsize + connStrIncr; - //_connectionString = m.Success ? - // Regex.Replace(_connectionString, pattern, $"Max pool size={PoolSize}", RegexOptions.IgnoreCase) : - // $"{_connectionString};Max pool size={PoolSize}"; + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } - - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success) { PoolSize = int.Parse(m.Groups[1].Value); @@ -102,21 +101,13 @@ namespace FreeSql.ClickHouse _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs index 2c43d3f8..a41283ca 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengConnectionPool.cs @@ -73,8 +73,17 @@ namespace FreeSql.Dameng { _connectionString = value ?? ""; - var pattern = @"(Max\s*)?pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"(Max\s*)?pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -91,21 +100,13 @@ namespace FreeSql.Dameng _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs index e82713c1..dd4ff973 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs @@ -64,8 +64,17 @@ namespace FreeSql.Firebird { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -81,21 +90,13 @@ namespace FreeSql.Firebird _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs index 095b8fe2..fda36444 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseConnectionPool.cs @@ -64,8 +64,17 @@ namespace FreeSql.GBase { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -81,21 +90,13 @@ namespace FreeSql.GBase _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs index 3c9b846f..e363c42e 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESConnectionPool.cs @@ -75,8 +75,17 @@ namespace FreeSql.KingbaseES { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -92,21 +101,13 @@ namespace FreeSql.KingbaseES _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs index 7283a015..54bb99c2 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessConnectionPool.cs @@ -63,8 +63,17 @@ namespace FreeSql.MsAccess { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success) { if (int.TryParse(m.Groups[1].Value, out var poolsize) && poolsize > 0) @@ -80,21 +89,13 @@ namespace FreeSql.MsAccess _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs index 8bc611f0..39c70ecc 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs @@ -68,8 +68,17 @@ namespace FreeSql.MySql { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -85,21 +94,13 @@ namespace FreeSql.MySql _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } @@ -139,7 +140,7 @@ namespace FreeSql.MySql { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } @@ -169,7 +170,7 @@ namespace FreeSql.MySql { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs index 359997b9..4be0c321 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengConnectionPool.cs @@ -75,8 +75,17 @@ namespace FreeSql.Odbc.Dameng { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -92,21 +101,13 @@ namespace FreeSql.Odbc.Dameng _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs index d181b087..6af2dab1 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcConnectionPool.cs @@ -64,8 +64,17 @@ namespace FreeSql.Odbc.Default { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -81,21 +90,13 @@ namespace FreeSql.Odbc.Default _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs index b8ed480e..0ffb42c1 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESConnectionPool.cs @@ -75,8 +75,17 @@ namespace FreeSql.Odbc.KingbaseES { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -92,21 +101,13 @@ namespace FreeSql.Odbc.KingbaseES _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs index 114c6b44..d4c2f0eb 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlConnectionPool.cs @@ -64,8 +64,17 @@ namespace FreeSql.Odbc.MySql { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -81,21 +90,13 @@ namespace FreeSql.Odbc.MySql _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs index bd0a75f9..58983b72 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleConnectionPool.cs @@ -75,8 +75,17 @@ namespace FreeSql.Odbc.Oracle { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -92,21 +101,13 @@ namespace FreeSql.Odbc.Oracle _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs index 23921daa..40d06352 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLConnectionPool.cs @@ -65,8 +65,17 @@ namespace FreeSql.Odbc.PostgreSQL { _connectionString = value ?? ""; - var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[2].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 50; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -82,21 +91,13 @@ namespace FreeSql.Odbc.PostgreSQL _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[2].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs index 537b7703..752567cc 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerConnectionPool.cs @@ -64,8 +64,17 @@ namespace FreeSql.Odbc.SqlServer { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -81,21 +90,13 @@ namespace FreeSql.Odbc.SqlServer _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs index 46e112a9..d29b0637 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs @@ -75,8 +75,17 @@ namespace FreeSql.Oracle { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -92,21 +101,13 @@ namespace FreeSql.Oracle _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } @@ -146,7 +147,7 @@ namespace FreeSql.Oracle { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } @@ -176,7 +177,7 @@ namespace FreeSql.Oracle { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs index dcd27704..49fef7c7 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs @@ -65,8 +65,17 @@ namespace FreeSql.PostgreSQL { _connectionString = value ?? ""; - var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[2].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 50; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -82,21 +91,13 @@ namespace FreeSql.PostgreSQL _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[2].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs index f0ec4320..33788535 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongConnectionPool.cs @@ -63,8 +63,17 @@ namespace FreeSql.ShenTong { _connectionString = value ?? ""; - var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[2].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 50; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -80,21 +89,13 @@ namespace FreeSql.ShenTong _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[2].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs index 2a0a0edf..849e13ab 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs @@ -68,8 +68,17 @@ namespace FreeSql.SqlServer { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); PoolSize = poolsize + connStrIncr; @@ -85,21 +94,13 @@ namespace FreeSql.SqlServer _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); return obj.Value.Ping(true); } @@ -140,7 +141,7 @@ namespace FreeSql.SqlServer { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } @@ -161,7 +162,6 @@ namespace FreeSql.SqlServer if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false) { - try { await obj.Value.OpenAsync(); @@ -170,7 +170,7 @@ namespace FreeSql.SqlServer { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs index ce7e0af6..88fef4de 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs @@ -76,8 +76,17 @@ namespace FreeSql.Sqlite { _connectionString = value ?? ""; - var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; - Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + var minPoolSize = 0; + var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; + var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); + if (m.Success) + { + minPoolSize = int.Parse(m.Groups[1].Value); + _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); + } + + pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; + m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); if (m.Success) { PoolSize = int.Parse(m.Groups[1].Value); @@ -92,15 +101,6 @@ namespace FreeSql.Sqlite _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var minPoolSize = 0; - pattern = @"Min\s*pool\s*size\s*=\s*(\d+)"; - m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); - if (m.Success) - { - minPoolSize = int.Parse(m.Groups[1].Value); - _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); - } - var att = Regex.Split(_connectionString, @"Pooling\s*=\s*", RegexOptions.IgnoreCase); if (att.Length == 2) { @@ -132,6 +132,7 @@ namespace FreeSql.Sqlite public bool OnCheckAvailable(Object obj) { + if (obj.Value == null) return false; if (obj.Value.State == ConnectionState.Closed) obj.Value.OpenAndAttach(Attaches); return obj.Value.Ping(true); } @@ -174,7 +175,7 @@ namespace FreeSql.Sqlite { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } } @@ -204,7 +205,7 @@ namespace FreeSql.Sqlite { if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); - throw ex; + throw; } } }