From a59ef190d4d823f1bfd1c3f06b5e46a0c5e54c05 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 8 May 2019 19:11:40 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E9=A2=84=E7=83=AD=E7=AD=96=E7=95=A5=EF=BC=9Amin=20pool=20size?= =?UTF-8?q?=20=E4=B8=8D=E8=AE=BE=E7=BD=AE=E6=88=96=20<=3D=200=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E9=BB=98=E8=AE=A4=E9=A2=84=E7=83=AD=205=E4=B8=AA?= =?UTF-8?q?=EF=BC=9B=E4=B9=9F=E5=8F=AF=E4=BB=A5=E8=AE=BE=E7=BD=AE=201?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeUtil.cs | 8 +++++--- FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs | 10 +++++++++- FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs | 10 +++++++++- .../PostgreSQLAdo/PostgreSQLConnectionPool.cs | 14 +++++++++++--- .../SqlServerAdo/SqlServerConnectionPool.cs | 10 +++++++++- FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs | 10 +++++++++- 6 files changed, 52 insertions(+), 10 deletions(-) diff --git a/FreeSql/FreeUtil.cs b/FreeSql/FreeUtil.cs index 6e3f7fb4..1bc14ccb 100644 --- a/FreeSql/FreeUtil.cs +++ b/FreeSql/FreeUtil.cs @@ -32,7 +32,9 @@ public static class FreeUtil { return Guid.Parse(guid); } - internal static void PrevReheatConnectionPool(ObjectPool pool) { + internal static void PrevReheatConnectionPool(ObjectPool pool, int minPoolSize) { + if (minPoolSize <= 0) minPoolSize = Math.Min(5, pool.Policy.PoolSize); + if (minPoolSize > pool.Policy.PoolSize) minPoolSize = pool.Policy.PoolSize; var initTestOk = true; var initStartTime = DateTime.Now; var initConns = new ConcurrentBag>(); @@ -44,9 +46,9 @@ public static class FreeUtil { } catch { initTestOk = false; //预热一次失败,后面将不进行 } - for (var a = 1; initTestOk && a < pool.Policy.PoolSize; a += 10) { + for (var a = 1; initTestOk && a < minPoolSize; a += 10) { if (initStartTime.Subtract(DateTime.Now).TotalSeconds > 3) break; //预热耗时超过3秒,退出 - var b = Math.Min(pool.Policy.PoolSize - a, 10); //每10个预热 + var b = Math.Min(minPoolSize - a, 10); //每10个预热 var initTasks = new Task[b]; for (var c = 0; c < b; c++) { initTasks[c] = Task.Run(() => { diff --git a/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs b/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs index a4538193..4c244e70 100644 --- a/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs +++ b/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs @@ -69,7 +69,15 @@ namespace FreeSql.MySql { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool); + 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); + } + + FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs b/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs index 45e0e234..d8b8d806 100644 --- a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs +++ b/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs @@ -83,7 +83,15 @@ namespace FreeSql.Oracle { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool); + 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); + } + + FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs index 2db52029..405bb956 100644 --- a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs +++ b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs @@ -62,9 +62,9 @@ namespace FreeSql.PostgreSQL { set { _connectionString = value ?? ""; - var pattern = @"Maximum\s*pool\s*size\s*=\s*(\d+)"; + var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; Match 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; + 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) => oldval + 1); PoolSize = poolsize + connStrIncr; _connectionString = m.Success ? @@ -78,7 +78,15 @@ namespace FreeSql.PostgreSQL { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool); + 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); + } + + FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs b/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs index 5c9f4820..ae216031 100644 --- a/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs +++ b/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs @@ -73,7 +73,15 @@ namespace FreeSql.SqlServer { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool); + 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); + } + + FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs b/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs index 9390ae46..402b9a40 100644 --- a/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs +++ b/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs @@ -74,13 +74,21 @@ 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, @"Attachs\s*=\s*", RegexOptions.IgnoreCase); if (att.Length == 2) { var idx = att[1].IndexOf(';'); Attaches = (idx == -1 ? att[1] : att[1].Substring(0, idx)).Split(','); } - FreeUtil.PrevReheatConnectionPool(_pool); + FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); } }