解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# ¶ÔÏó³Ø 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<T> ½Ó¿Ú
```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<T> Àà
```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<T> | ArrayPool<T> |
|------|--------------|-------------------|
| Ä¿±êÀàÐÍ | ÒýÓÃÀàÐÍ | Êý×é |
| Ḭ̈߳²È« | ÊÇ£¨CAS£© | ÊÇ |
| GC ÇåÀí | ¿ÉÑ¡ | ×Ô¶¯ |
| ´óСµ÷Õû | ¹Ì¶¨ | ¶¯Ì¬ |
| ÊÊÓó¡¾° | ¶ÔÏó¸´Óà | »º³åÇø |
## ×î¼Ñʵ¼ù
1. **¼°Ê±¹é»¹**£ºÊ¹Óà try-finally È·±£¶ÔÏó¹é»¹
2. **ÖØÖÃ״̬**£º¹é»¹Ç°ÇåÀí¶ÔÏóÄÚ²¿×´Ì¬
3. **ÑéÖ¤¶ÔÏó**£º¹é»¹Ê±¼ì²é¶ÔÏóÓÐЧÐÔ
4. **ºÏÀí´óС**£º¸ù¾Ý²¢·¢Á¿ÉèÖóشóС
5. **±ÜÃâй©**£ºÈ·±£Ò쳣·¾¶Ò²Äܹ黹¶ÔÏó
## Ïà¹ØÁ´½Ó
- [»º´æÏµÍ³ ICache](/NewLife/X/Blob/dev/Doc/cache-»º´æÏµÍ³ICache.md)
- [×Ö·û´®À©Õ¹ StringHelper](/NewLife/X/Blob/dev/Doc/string_helper-×Ö·û´®À©Õ¹StringHelper.md)
- [Êý¾ÝÀ©Õ¹ IOHelper](/NewLife/X/Blob/dev/Doc/io_helper-Êý¾ÝÀ©Õ¹IOHelper.md)
|