From f5a292ef450916044c73f0a06ef00f4138ff16a9 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 29 Apr 2019 18:22:03 +0800 Subject: [PATCH] =?UTF-8?q?IFreeSql=20=E5=A2=9E=E5=8A=A0=20IDisposable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Interface/IFreeSql.cs | 2 +- .../CommonProvider/AdoProvider/AdoProvider.cs | 2 +- .../AdoProvider/AdoProviderTransaction.cs | 37 +++++++++++++++---- .../Internal/CommonProvider/CacheProvider.cs | 12 +++++- FreeSql/Internal/UtilsExpressionTree.cs | 15 ++++---- FreeSql/MySql/MySqlProvider.cs | 10 +++++ FreeSql/Oracle/OracleProvider.cs | 10 +++++ FreeSql/PostgreSQL/PostgreSQLProvider.cs | 10 +++++ FreeSql/SqlServer/SqlServerProvider.cs | 10 +++++ FreeSql/Sqlite/SqliteProvider.cs | 10 +++++ 10 files changed, 101 insertions(+), 17 deletions(-) diff --git a/FreeSql/Interface/IFreeSql.cs b/FreeSql/Interface/IFreeSql.cs index b25c13c1..0350a8f3 100644 --- a/FreeSql/Interface/IFreeSql.cs +++ b/FreeSql/Interface/IFreeSql.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; public interface IFreeSql : IFreeSql { } -public interface IFreeSql { +public interface IFreeSql : IDisposable { /// /// 插入数据 /// diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index d51b28b1..d6ae51a8 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -11,7 +11,7 @@ using System.Text; using System.Reflection; namespace FreeSql.Internal.CommonProvider { - abstract partial class AdoProvider : IAdo { + abstract partial class AdoProvider : IAdo, IDisposable { protected abstract void ReturnConnection(ObjectPool pool, Object conn, Exception ex); protected abstract DbCommand CreateCommand(); diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs index a0f3e612..7a24c016 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs @@ -110,13 +110,6 @@ namespace FreeSql.Internal.CommonProvider { public void CommitTransaction() => CommitTransaction(true); public void RollbackTransaction() => CommitTransaction(false); - public void Dispose() { - Transaction2[] trans = null; - lock (_trans_lock) - trans = _trans.Values.ToArray(); - foreach (Transaction2 tran in trans) CommitTransaction(false, tran); - } - public void Transaction(Action handler) { Transaction(handler, TimeSpan.FromSeconds(60)); } @@ -130,5 +123,35 @@ namespace FreeSql.Internal.CommonProvider { throw ex; } } + + ~AdoProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + try { + Transaction2[] trans = null; + lock (_trans_lock) + trans = _trans.Values.ToArray(); + foreach (Transaction2 tran in trans) CommitTransaction(false, tran); + } catch { } + + ObjectPool[] pools = null; + for (var a = 0; a < 10; a++) { + try { + pools = SlavePools.ToArray(); + SlavePools.Clear(); + break; + } catch { + } + } + if (pools != null) { + foreach (var pool in pools) { + try { pool.Dispose(); } catch { } + } + } + try { MasterPool.Dispose(); } catch { } + } } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/CacheProvider.cs b/FreeSql/Internal/CommonProvider/CacheProvider.cs index 5bc0e9d1..4bbda7da 100644 --- a/FreeSql/Internal/CommonProvider/CacheProvider.cs +++ b/FreeSql/Internal/CommonProvider/CacheProvider.cs @@ -9,7 +9,7 @@ using System.Text; using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - class CacheProvider : ICache { + class CacheProvider : ICache, IDisposable { public IDistributedCache Cache { get; private set; } private bool CacheSupportMultiRemove = false; @@ -30,6 +30,16 @@ namespace FreeSql.Internal.CommonProvider { } } + ~CacheProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + + Cache = null; + } + public Func Serialize { get; set; } public Func Deserialize { get; set; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 79b4202e..065ef133 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -542,7 +542,7 @@ namespace FreeSql.Internal { if (findtbrefPkCsName.StartsWith(tbref.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtbrefPkCsName = findtbrefPkCsName.Substring(tbref.Type.Name.Length).TrimStart('_'); if (trytb.ColumnsByCs.TryGetValue($"{pnv.Name}{findtbrefPkCsName}", out var trycol) == false && //骆峰命名 trytb.ColumnsByCs.TryGetValue($"{pnv.Name}_{findtbrefPkCsName}", out trycol) == false && //下划线命名 - tbref.Primarys.Length == 1 && + //tbref.Primarys.Length == 1 && trytb.ColumnsByCs.TryGetValue($"{pnv.Name}_Id", out trycol) == false && trytb.ColumnsByCs.TryGetValue($"{pnv.Name}Id", out trycol) == false ) { @@ -569,12 +569,13 @@ namespace FreeSql.Internal { if (isLazy) throw nvref.Exception; continue; } - if (trycol == null) { - nvref.Exception = new Exception($"导航属性 {trytbTypeName}.{pnv.Name} 没有找到对应的字段,如:{pnv.Name}{findtbrefPkCsName}、{pnv.Name}_{findtbrefPkCsName}"); - trytb.AddOrUpdateTableRef(pnv.Name, nvref); - if (isLazy) throw nvref.Exception; - continue; - } + } + + if (trycol == null) { + nvref.Exception = new Exception($"导航属性 {trytbTypeName}.{pnv.Name} 没有找到对应的字段,如:{pnv.Name}{findtbrefPkCsName}、{pnv.Name}_{findtbrefPkCsName}"); + trytb.AddOrUpdateTableRef(pnv.Name, nvref); + if (isLazy) throw nvref.Exception; + continue; } nvref.Columns.Add(trycol); diff --git a/FreeSql/MySql/MySqlProvider.cs b/FreeSql/MySql/MySqlProvider.cs index 22fb58be..2387c54a 100644 --- a/FreeSql/MySql/MySqlProvider.cs +++ b/FreeSql/MySql/MySqlProvider.cs @@ -57,5 +57,15 @@ namespace FreeSql.MySql { public void Transaction(Action handler) => Ado.Transaction(handler); public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout); + + ~MySqlProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + (this.Ado as AdoProvider).Dispose(); + (this.Cache as CacheProvider)?.Dispose(); + } } } diff --git a/FreeSql/Oracle/OracleProvider.cs b/FreeSql/Oracle/OracleProvider.cs index b4720c99..b595f2a1 100644 --- a/FreeSql/Oracle/OracleProvider.cs +++ b/FreeSql/Oracle/OracleProvider.cs @@ -48,5 +48,15 @@ namespace FreeSql.Oracle { public void Transaction(Action handler) => Ado.Transaction(handler); public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout); + + ~OracleProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + (this.Ado as AdoProvider).Dispose(); + (this.Cache as CacheProvider)?.Dispose(); + } } } diff --git a/FreeSql/PostgreSQL/PostgreSQLProvider.cs b/FreeSql/PostgreSQL/PostgreSQLProvider.cs index c8e06005..bbc28288 100644 --- a/FreeSql/PostgreSQL/PostgreSQLProvider.cs +++ b/FreeSql/PostgreSQL/PostgreSQLProvider.cs @@ -84,5 +84,15 @@ namespace FreeSql.PostgreSQL { public void Transaction(Action handler) => Ado.Transaction(handler); public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout); + + ~PostgreSQLProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + (this.Ado as AdoProvider).Dispose(); + (this.Cache as CacheProvider)?.Dispose(); + } } } diff --git a/FreeSql/SqlServer/SqlServerProvider.cs b/FreeSql/SqlServer/SqlServerProvider.cs index b165e2c9..c81dc09a 100644 --- a/FreeSql/SqlServer/SqlServerProvider.cs +++ b/FreeSql/SqlServer/SqlServerProvider.cs @@ -55,5 +55,15 @@ namespace FreeSql.SqlServer { public void Transaction(Action handler) => Ado.Transaction(handler); public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout); + + ~SqlServerProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + (this.Ado as AdoProvider).Dispose(); + (this.Cache as CacheProvider)?.Dispose(); + } } } diff --git a/FreeSql/Sqlite/SqliteProvider.cs b/FreeSql/Sqlite/SqliteProvider.cs index 88ef2a7a..be1bcf45 100644 --- a/FreeSql/Sqlite/SqliteProvider.cs +++ b/FreeSql/Sqlite/SqliteProvider.cs @@ -47,5 +47,15 @@ namespace FreeSql.Sqlite { public void Transaction(Action handler) => Ado.Transaction(handler); public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout); + + ~SqliteProvider() { + this.Dispose(); + } + bool _isdisposed = false; + public void Dispose() { + if (_isdisposed) return; + (this.Ado as AdoProvider).Dispose(); + (this.Cache as CacheProvider)?.Dispose(); + } } }