From c3c753915098b333a9284fd1736a9ced0dcb890f Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 10 Apr 2019 13:50:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=B1=A0=E5=AF=B9=E8=B1=A1=E9=A2=84=E7=83=AD=E6=95=88=E7=8E=87?= =?UTF-8?q?=EF=BC=8C=E5=BC=80=E5=90=AF=E6=AF=8F10=E4=B8=AA=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E8=BF=9B=E8=A1=8C=E9=A2=84=E7=83=AD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeUtil.cs | 38 ++++++++++++++++++- FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs | 11 +----- .../Oracle/OracleAdo/OracleConnectionPool.cs | 11 +----- .../PostgreSQLAdo/PostgreSQLConnectionPool.cs | 11 +----- .../SqlServerAdo/SqlServerConnectionPool.cs | 11 +----- .../Sqlite/SqliteAdo/SqliteConnectionPool.cs | 11 +----- 6 files changed, 42 insertions(+), 51 deletions(-) diff --git a/FreeSql/FreeUtil.cs b/FreeSql/FreeUtil.cs index 9d7fb805..6e3f7fb4 100644 --- a/FreeSql/FreeUtil.cs +++ b/FreeSql/FreeUtil.cs @@ -1,6 +1,10 @@ -using System; +using SafeObjectPool; +using System; +using System.Collections.Concurrent; +using System.Data.Common; using System.Diagnostics; using System.Threading; +using System.Threading.Tasks; public static class FreeUtil { @@ -27,4 +31,36 @@ public static class FreeUtil { var guid = $"{uninxtime.ToString("x8").PadLeft(8, '0')}{__staticMachine.ToString("x8").PadLeft(8, '0').Substring(2, 6)}{__staticPid.ToString("x8").PadLeft(8, '0').Substring(6, 2)}{increment.ToString("x8").PadLeft(8, '0')}{rand.ToString("x8").PadLeft(8, '0')}"; return Guid.Parse(guid); } + + internal static void PrevReheatConnectionPool(ObjectPool pool) { + var initTestOk = true; + var initStartTime = DateTime.Now; + var initConns = new ConcurrentBag>(); + + try { + var conn = pool.Get(); + initConns.Add(conn); + pool.Policy.OnCheckAvailable(conn); + } catch { + initTestOk = false; //预热一次失败,后面将不进行 + } + for (var a = 1; initTestOk && a < pool.Policy.PoolSize; a += 10) { + if (initStartTime.Subtract(DateTime.Now).TotalSeconds > 3) break; //预热耗时超过3秒,退出 + var b = Math.Min(pool.Policy.PoolSize - a, 10); //每10个预热 + var initTasks = new Task[b]; + for (var c = 0; c < b; c++) { + initTasks[c] = Task.Run(() => { + try { + var conn = pool.Get(); + initConns.Add(conn); + pool.Policy.OnCheckAvailable(conn); + } catch { + initTestOk = false; //有失败,下一组退出预热 + } + }); + } + Task.WaitAll(initTasks); + } + while (initConns.TryTake(out var conn)) pool.Return(conn); + } } \ No newline at end of file diff --git a/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs b/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs index 5630c6a7..a4538193 100644 --- a/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs +++ b/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs @@ -69,16 +69,7 @@ namespace FreeSql.MySql { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var initConns = new List>(); - for (var a = 0; a < PoolSize; a++) - try { - var conn = _pool.Get(); - initConns.Add(conn); - conn.Value.Ping(true); - } catch { - break; //预热失败一次就退出 - } - foreach (var conn in initConns) _pool.Return(conn); + FreeUtil.PrevReheatConnectionPool(_pool); } } diff --git a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs b/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs index 9db33d4d..45e0e234 100644 --- a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs +++ b/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs @@ -83,16 +83,7 @@ namespace FreeSql.Oracle { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var initConns = new List>(); - for (var a = 0; a < PoolSize; a++) - try { - var conn = _pool.Get(); - initConns.Add(conn); - conn.Value.Ping(true); - } catch { - break; //预热失败一次就退出 - } - foreach (var conn in initConns) _pool.Return(conn); + FreeUtil.PrevReheatConnectionPool(_pool); } } diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs index 7e418b76..2db52029 100644 --- a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs +++ b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs @@ -78,16 +78,7 @@ namespace FreeSql.PostgreSQL { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var initConns = new List>(); - for (var a = 0; a < PoolSize; a++) - try { - var conn = _pool.Get(); - initConns.Add(conn); - conn.Value.Ping(true); - } catch { - break; //预热失败一次就退出 - } - foreach (var conn in initConns) _pool.Return(conn); + FreeUtil.PrevReheatConnectionPool(_pool); } } diff --git a/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs b/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs index ee55a758..5c9f4820 100644 --- a/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs +++ b/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs @@ -73,16 +73,7 @@ namespace FreeSql.SqlServer { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - var initConns = new List>(); - for (var a = 0; a < PoolSize; a++) - try { - var conn = _pool.Get(); - initConns.Add(conn); - conn.Value.Ping(true); - } catch { - break; //预热失败一次就退出 - } - foreach (var conn in initConns) _pool.Return(conn); + FreeUtil.PrevReheatConnectionPool(_pool); } } diff --git a/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs b/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs index 6dd5fa08..9390ae46 100644 --- a/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs +++ b/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs @@ -80,16 +80,7 @@ namespace FreeSql.Sqlite { Attaches = (idx == -1 ? att[1] : att[1].Substring(0, idx)).Split(','); } - var initConns = new List>(); - for (var a = 0; a < PoolSize; a++) - try { - var conn = _pool.Get(); - initConns.Add(conn); - conn.Value.Ping(true); - } catch { - break; //预热失败一次就退出 - } - foreach (var conn in initConns) _pool.Return(conn); + FreeUtil.PrevReheatConnectionPool(_pool); } }