解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
7.17 KiB
X
# ¶ÔÏó³Ø Pool ## ¸ÅÊö `Pool<T>` ÊÇ NewLife.Core ÖеÄÇáÁ¿¼¶¶ÔÏó³ØÊµÏÖ£¬²ÉÓÃÊý×éÎÞËøÉè¼Æ£¬Í¨¹ý CAS ²Ù×÷ʵÏÖ¸ßÐÔÄܵĶÔÏó¸´Ó᣶ÔÏó³Ø¿ÉÒÔÏÔÖø¼õÉÙÆµ·±´´½¨Ïú»Ù¶ÔÏó´øÀ´µÄ GC ѹÁ¦£¬ÌرðÊÊºÏ¸ßÆµ³¡¾°¡£ **ÃüÃû¿Õ¼ä**£º`NewLife.Collections` **ÎĵµµØÖ·**£ºhttps://newlifex.com/core/object_pool ## ºËÐÄÌØÐÔ - **ÎÞËøÉè¼Æ**£ºÊ¹Óà `Interlocked.CompareExchange` ʵÏÖÎÞËø²¢·¢ - **Èȵã²Ûλ**£ºµ¥¶Àά»¤×îÈȶÔÏó£¬ÌáÉý·ÃÎÊËÙ¶È - **GC ÓѺÃ**£ºÖ§³Ö¶þ´ú GC ʱ×Ô¶¯ÇåÀí - **¸ßÐÔÄÜ**£ºO(N) ɨÃ裬½á¹¹Ìå³ÖÓÐÒýÓñÜÃâ¶îÍâ·ÖÅä - **ÄÚÖóØ**£ºÌṩ `StringBuilder`¡¢`MemoryStream` µÈ³£ÓÃ³Ø ## ¿ìËÙ¿ªÊ¼ ### »ù±¾Ê¹Óà ```csharp using NewLife.Collections; // ´´½¨¶ÔÏó³Ø var pool = new Pool<MyObject>(); // »ñÈ¡¶ÔÏó var obj = pool.Get(); try { // ʹÓöÔÏó... obj.DoSomething(); } finally { // ¹é»¹¶ÔÏó pool.Return(obj); } ``` ### ʹÓÃÄÚÖà StringBuilder ³Ø ```csharp using NewLife.Collections; // ´Ó³ØÖлñÈ¡ StringBuilder var sb = Pool.StringBuilder.Get(); sb.Append("Hello "); sb.Append("World"); // ¹é»¹²¢»ñÈ¡½á¹û var result = sb.Return(true); // ·µ»Ø "Hello World" // »ò²»ÐèÒª½á¹ûʱ sb.Return(false); ``` ## API ²Î¿¼ ### IPool&lt;T&gt; ½Ó¿Ú ```csharp public interface IPool<T> { /// <summary>¶ÔÏ󳨴óС</summary> Int32 Max { get; set; } /// <summary>»ñÈ¡¶ÔÏó</summary> T Get(); /// <summary>¹é»¹¶ÔÏó</summary> Boolean Return(T value); /// <summary>Çå¿Õ¶ÔÏó³Ø</summary> Int32 Clear(); } ``` ### Pool&lt;T&gt; Àà ```csharp public class Pool<T> : IPool<T> where T : class { /// <summary>¶ÔÏ󳨴óС¡£Ä¬ÈÏ CPU*2£¬×îС8</summary> public Int32 Max { get; set; } /// <summary>»ñÈ¡¶ÔÏ󣬳ؿÕʱ´´½¨ÐÂʵÀý</summary> public virtual T Get(); /// <summary>¹é»¹¶ÔÏó</summary> public virtual Boolean Return(T value); /// <summary>Çå¿Õ¶ÔÏó³Ø</summary> public virtual Int32 Clear(); /// <summary>´´½¨¶ÔÏ󣨿ÉÖØÐ´£©</summary> protected virtual T? OnCreate(); } ``` #### ¹¹Ô캯Êý ```csharp // ĬÈϹ¹Ô죬´óСΪ CPU*2 var pool = new Pool<MyObject>(); // Ö¸¶¨´óС var pool = new Pool<MyObject>(100); // ÆôÓà GC ÇåÀí£¨protected£© protected Pool(Int32 max, Boolean useGcClear) ``` ## ÄÚÖöÔÏó³Ø ### StringBuilder ³Ø ```csharp public static class Pool { /// <summary>×Ö·û´®¹¹½¨Æ÷³Ø</summary> public static IPool<StringBuilder> StringBuilder { get; set; } } ``` **ʹÓÃʾÀý**£º ```csharp var sb = Pool.StringBuilder.Get(); sb.Append("Name: "); sb.Append(name); sb.AppendLine(); // ·½Ê½1£º¹é»¹²¢»ñÈ¡½á¹û var result = sb.Return(true); // ·½Ê½2£º½ö¹é»¹ sb.Return(false); ``` ### StringBuilderPool Àà ```csharp public class StringBuilderPool : Pool<StringBuilder> { /// <summary>³õʼÈÝÁ¿¡£Ä¬ÈÏ100</summary> public Int32 InitialCapacity { get; set; } /// <summary>×î´óÈÝÁ¿¡£³¬¹ý²»Èë³Ø£¬Ä¬ÈÏ4K</summary> public Int32 MaximumCapacity { get; set; } } ``` ¹é»¹Ê±×Ô¶¯Çå¿ÕÄÚÈÝ£¬³¬¹ý×î´óÈÝÁ¿µÄ²»·ÅÈë³ØÖС£ ## ʹÓó¡¾° ### 1. ¸ßƵ¶ÔÏó¸´Óà ```csharp public class MessageProcessor { private readonly Pool<Message> _pool = new(); public void Process(Byte[] data) { var msg = _pool.Get(); try { msg.Parse(data); HandleMessage(msg); } finally { msg.Reset(); // ÖØÖÃ״̬ _pool.Return(msg); } } } ``` ### 2. »º³åÇø³Ø ```csharp public class BufferPool : Pool<Byte[]> { public Int32 BufferSize { get; set; } = 4096; protected override Byte[] OnCreate() => new Byte[BufferSize]; public override Boolean Return(Byte[] value) { // ´óС²»Æ¥Åä²»Èë³Ø if (value.Length != BufferSize) return false; // Çå¿ÕÊý¾Ý Array.Clear(value, 0, value.Length); return base.Return(value); } } // ʹÓà var bufferPool = new BufferPool { BufferSize = 8192 }; var buffer = bufferPool.Get(); try { var read = stream.Read(buffer, 0, buffer.Length); // ´¦ÀíÊý¾Ý... } finally { bufferPool.Return(buffer); } ``` ### 3. Êý¾Ý¿âÁ¬½Ó³Ø ```csharp public class ConnectionPool : Pool<DbConnection> { public String ConnectionString { get; set; } protected override DbConnection OnCreate() { var conn = new MySqlConnection(ConnectionString); conn.Open(); return conn; } public override Boolean Return(DbConnection value) { // Á¬½ÓÒѶϿªÔò²»Èë³Ø if (value.State != ConnectionState.Open) return false; return base.Return(value); } } ``` ### 4. ÁÙʱ¼¯ºÏ ```csharp public class ListPool<T> : Pool<List<T>> { public Int32 MaxCapacity { get; set; } = 1000; protected override List<T> OnCreate() => new(16); public override Boolean Return(List<T> value) { if (value.Capacity > MaxCapacity) return false; value.Clear(); return base.Return(value); } } // ʹÓà var listPool = new ListPool<Int32>(); var list = listPool.Get(); try { list.Add(1); list.Add(2); // ´¦Àí... } finally { listPool.Return(list); } ``` ### 5. ½áºÏ using ģʽ ```csharp public class PooledObject<T> : IDisposable where T : class { private readonly IPool<T> _pool; public T Value { get; } public PooledObject(IPool<T> pool) { _pool = pool; Value = pool.Get(); } public void Dispose() { _pool.Return(Value); } } // ʹÓà using (var pooled = new PooledObject<StringBuilder>(Pool.StringBuilder)) { pooled.Value.Append("Hello"); var result = pooled.Value.ToString(); } ``` ## ×Ô¶¨Òå¶ÔÏó³Ø ```csharp public class MyObjectPool : Pool<MyObject> { public MyObjectPool() : base(100) { } // ³Ø´óС100 protected override MyObject OnCreate() { // ×Ô¶¨Òå´´½¨Âß¼­ return new MyObject { Id = Guid.NewGuid(), CreateTime = DateTime.Now }; } public override Boolean Return(MyObject value) { // ¹é»¹Ç°ÖØÖöÔÏó value.Reset(); // ÑéÖ¤¶ÔÏó״̬ if (!value.IsValid) return false; return base.Return(value); } } ``` ## ÐÔÄÜÓÅ»¯ ### 1. Ô¤ÈȶÔÏó³Ø ```csharp var pool = new Pool<MyObject>(50); // Ô¤ÈÈ£º´´½¨Ò»Åú¶ÔÏó·ÅÈë³ØÖÐ for (var i = 0; i < 50; i++) { var obj = new MyObject(); pool.Return(obj); } ``` ### 2. ºÏÀíÉèÖôóС ```csharp // ¸ù¾Ý²¢·¢Á¿ÉèÖà var pool = new Pool<MyObject>(Environment.ProcessorCount * 4); ``` ### 3. ±ÜÃâ´ó¶ÔÏó ```csharp // ´ó¶ÔÏó¿ÉÄÜÓ°Ïì GC£¬¿¼ÂÇʹÓà ArrayPool var buffer = ArrayPool<Byte>.Shared.Rent(1024 * 1024); try { // ʹÓûº³åÇø } finally { ArrayPool<Byte>.Shared.Return(buffer); } ``` ## Óë ArrayPool ¶Ô±È | ÌØÐÔ | Pool&lt;T&gt; | ArrayPool&lt;T&gt; | |------|--------------|-------------------| | Ä¿±êÀàÐÍ | ÒýÓÃÀàÐÍ | Êý×é | | Ḭ̈߳²È« | ÊÇ£¨CAS£© | ÊÇ | | GC ÇåÀí | ¿ÉÑ¡ | ×Ô¶¯ | | ´óСµ÷Õû | ¹Ì¶¨ | ¶¯Ì¬ | | ÊÊÓó¡¾° | ¶ÔÏó¸´Óà | »º³åÇø | ## ×î¼Ñʵ¼ù 1. **¼°Ê±¹é»¹**£ºÊ¹Óà try-finally È·±£¶ÔÏó¹é»¹ 2. **ÖØÖÃ״̬**£º¹é»¹Ç°ÇåÀí¶ÔÏóÄÚ²¿×´Ì¬ 3. **ÑéÖ¤¶ÔÏó**£º¹é»¹Ê±¼ì²é¶ÔÏóÓÐЧÐÔ 4. **ºÏÀí´óС**£º¸ù¾Ý²¢·¢Á¿ÉèÖóشóС 5. **±ÜÃâй©**£ºÈ·±£Ò쳣·¾¶Ò²Äܹ黹¶ÔÏó ## Ïà¹ØÁ´½Ó - [»º´æÏµÍ³ ICache](/NewLife/X/Blob/master/Doc/cache-»º´æÏµÍ³ICache.md) - [×Ö·û´®À©Õ¹ StringHelper](/NewLife/X/Blob/master/Doc/string_helper-×Ö·û´®À©Õ¹StringHelper.md) - [Êý¾ÝÀ©Õ¹ IOHelper](/NewLife/X/Blob/master/Doc/io_helper-Êý¾ÝÀ©Õ¹IOHelper.md)