- 增加 ObservableCollection 级联加载和保存;- 修复 达梦 min pool size 预热数量匹配 bug;

This commit is contained in:
2881099 2022-06-02 12:24:17 +08:00
parent 617cfb8744
commit 403b10ba94
26 changed files with 272 additions and 238 deletions

View File

@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<Version>3.2.661</Version> <Version>3.2.666-preview202200601</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -283,6 +283,8 @@ namespace base_entity
//.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") //.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2")
//.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
.UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user;poolsize=5;min pool size=1")
.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
//.UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2") //.UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2")

View File

@ -22,6 +22,7 @@
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" /> <ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" />
<ProjectReference Include="..\..\FreeSql.Repository\FreeSql.Repository.csproj" /> <ProjectReference Include="..\..\FreeSql.Repository\FreeSql.Repository.csproj" />
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" /> <ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Dameng\FreeSql.Provider.Dameng.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Firebird\FreeSql.Provider.Firebird.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.Firebird\FreeSql.Provider.Firebird.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj" />
<ProjectReference Include="..\..\Providers\FreeSql.Provider.Odbc\FreeSql.Provider.Odbc.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.Odbc\FreeSql.Provider.Odbc.csproj" />
@ -31,4 +32,9 @@
<ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" /> <ProjectReference Include="..\..\Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="DmProvider">
<HintPath>..\..\Providers\FreeSql.Provider.Dameng\lib\DmProvider\netstandard2.0\DmProvider.dll</HintPath>
</Reference>
</ItemGroup>
</Project> </Project>

View File

@ -795,5 +795,14 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -10,6 +10,7 @@ using System.Threading.Tasks;
using System.Text; using System.Text;
using Xunit; using Xunit;
using FreeSql.Internal.CommonProvider; using FreeSql.Internal.CommonProvider;
using System.Collections.ObjectModel;
namespace FreeSql.Tests.Sqlite namespace FreeSql.Tests.Sqlite
{ {
@ -1241,7 +1242,7 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
public string m2setting { get; set; } public string m2setting { get; set; }
public List<TestInclude_OneToManyModel3> childs { get; set; } public ObservableCollection<TestInclude_OneToManyModel3> childs { get; set; }
} }
public class TestInclude_OneToManyModel3 public class TestInclude_OneToManyModel3
{ {

View File

@ -5,6 +5,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.Common; using System.Data.Common;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
@ -395,7 +396,10 @@ namespace FreeSql.Internal
object ret; object ret;
if (string.IsNullOrEmpty(parent.IncludeManyKey) == false) if (string.IsNullOrEmpty(parent.IncludeManyKey) == false)
{ {
ret = typeof(List<>).MakeGenericType(parent.CsType).CreateInstanceGetDefaultValue(); if (parent.MapType == typeof(ObservableCollection<>).MakeGenericType(parent.CsType))
ret = parent.MapType.CreateInstanceGetDefaultValue();
else
ret = typeof(List<>).MakeGenericType(parent.CsType).CreateInstanceGetDefaultValue();
fillIncludeMany?.Add(NativeTuple.Create(parent.IncludeManyKey, ret as IList, rowIndex)); fillIncludeMany?.Add(NativeTuple.Create(parent.IncludeManyKey, ret as IList, rowIndex));
} }
else if (parent.SubSelectMany != null) else if (parent.SubSelectMany != null)
@ -408,6 +412,7 @@ namespace FreeSql.Internal
else else
{ {
var ctorParms = new object[ctorParmsLength]; var ctorParms = new object[ctorParmsLength];
var ctorParmsDefs = parent.Consturctor.GetParameters();
for (var c = 0; c < ctorParmsLength; c++) for (var c = 0; c < ctorParmsLength; c++)
ctorParms[c] = ReadAnonymous(parent.Childs[c], dr, ref index, notRead, null, rowIndex, fillIncludeMany, fillSubSelectMany); ctorParms[c] = ReadAnonymous(parent.Childs[c], dr, ref index, notRead, null, rowIndex, fillIncludeMany, fillSubSelectMany);
ret = parent.Consturctor.Invoke(ctorParms); ret = parent.Consturctor.Invoke(ctorParms);

View File

@ -671,17 +671,20 @@ namespace FreeSql.Internal.CommonProvider
var listValueExp = Expression.Parameter(typeof(List<TNavigate>), "listValue"); var listValueExp = Expression.Parameter(typeof(List<TNavigate>), "listValue");
var setListValue = membersExpNotNull == null ? var setListValue = membersExpNotNull == null ?
Expression.Lambda<Action<T1, List<TNavigate>>>( Expression.Lambda<Action<T1, List<TNavigate>>>(
Expression.Assign( collMem.Type == typeof(ObservableCollection<TNavigate>) ?
Expression.MakeMemberAccess(membersExp, collMem.Member), (Expression)Expression.IfThen(
Expression.TypeAs(listValueExp, collMem.Type) Expression.NotEqual(listValueExp, Expression.Constant(null, typeof(List<TNavigate>))),
), t1parm, listValueExp).Compile() : Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.New(typeof(ObservableCollection<TNavigate>).GetConstructor(new[] { typeof(List<TNavigate>) }), listValueExp))
Expression.Lambda<Action<T1, List<TNavigate>>>( ) :
Expression.IfThen( Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.TypeAs(listValueExp, collMem.Type))
membersExpNotNull, , t1parm, listValueExp).Compile() :
Expression.Assign( Expression.Lambda<Action<T1, List<TNavigate>>>(Expression.IfThen(membersExpNotNull,
Expression.MakeMemberAccess(membersExp, collMem.Member), collMem.Type == typeof(ObservableCollection<TNavigate>) ?
Expression.TypeAs(listValueExp, collMem.Type) (Expression)Expression.IfThen(
) Expression.NotEqual(listValueExp, Expression.Constant(null, typeof(List<TNavigate>))),
Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.New(typeof(ObservableCollection<TNavigate>).GetConstructor(new[] { typeof(List<TNavigate>) }), listValueExp))
) :
Expression.Assign(Expression.MakeMemberAccess(membersExp, collMem.Member), Expression.TypeAs(listValueExp, collMem.Type))
), t1parm, listValueExp).Compile(); ), t1parm, listValueExp).Compile();
var returnTarget = Expression.Label(typeof(object)); var returnTarget = Expression.Label(typeof(object));

View File

@ -76,18 +76,17 @@ namespace FreeSql.ClickHouse
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
//var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
//var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
//if (m.Success == false || int.TryParse(m.Groups[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100; var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
//var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); if (m.Success)
//PoolSize = poolsize + connStrIncr; {
//_connectionString = m.Success ? minPoolSize = int.Parse(m.Groups[1].Value);
// Regex.Replace(_connectionString, pattern, $"Max pool size={PoolSize}", RegexOptions.IgnoreCase) : _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
// $"{_connectionString};Max pool size={PoolSize}"; }
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success) if (m.Success)
{ {
PoolSize = int.Parse(m.Groups[1].Value); PoolSize = int.Parse(m.Groups[1].Value);
@ -102,21 +101,13 @@ namespace FreeSql.ClickHouse
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -73,8 +73,17 @@ namespace FreeSql.Dameng
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"(Max\s*)?pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"(Max\s*)?pool\s*size\s*=\s*(\d+)";
m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success == false || int.TryParse(m.Groups[2].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 = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -91,21 +100,13 @@ namespace FreeSql.Dameng
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -64,8 +64,17 @@ namespace FreeSql.Firebird
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -81,21 +90,13 @@ namespace FreeSql.Firebird
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -64,8 +64,17 @@ namespace FreeSql.GBase
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -81,21 +90,13 @@ namespace FreeSql.GBase
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -75,8 +75,17 @@ namespace FreeSql.KingbaseES
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -92,21 +101,13 @@ namespace FreeSql.KingbaseES
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -63,8 +63,17 @@ namespace FreeSql.MsAccess
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success) if (m.Success)
{ {
if (int.TryParse(m.Groups[1].Value, out var poolsize) && poolsize > 0) if (int.TryParse(m.Groups[1].Value, out var poolsize) && poolsize > 0)
@ -80,21 +89,13 @@ namespace FreeSql.MsAccess
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -68,8 +68,17 @@ namespace FreeSql.MySql
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -85,21 +94,13 @@ namespace FreeSql.MySql
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }
@ -139,7 +140,7 @@ namespace FreeSql.MySql
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }
@ -169,7 +170,7 @@ namespace FreeSql.MySql
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }

View File

@ -75,8 +75,17 @@ namespace FreeSql.Odbc.Dameng
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -92,21 +101,13 @@ namespace FreeSql.Odbc.Dameng
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -64,8 +64,17 @@ namespace FreeSql.Odbc.Default
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -81,21 +90,13 @@ namespace FreeSql.Odbc.Default
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -75,8 +75,17 @@ namespace FreeSql.Odbc.KingbaseES
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -92,21 +101,13 @@ namespace FreeSql.Odbc.KingbaseES
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -64,8 +64,17 @@ namespace FreeSql.Odbc.MySql
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -81,21 +90,13 @@ namespace FreeSql.Odbc.MySql
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -75,8 +75,17 @@ namespace FreeSql.Odbc.Oracle
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -92,21 +101,13 @@ namespace FreeSql.Odbc.Oracle
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -65,8 +65,17 @@ namespace FreeSql.Odbc.PostgreSQL
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[2].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)";
m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 50; 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) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -82,21 +91,13 @@ namespace FreeSql.Odbc.PostgreSQL
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
} }
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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -64,8 +64,17 @@ namespace FreeSql.Odbc.SqlServer
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -81,21 +90,13 @@ namespace FreeSql.Odbc.SqlServer
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -75,8 +75,17 @@ namespace FreeSql.Oracle
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -92,21 +101,13 @@ namespace FreeSql.Oracle
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }
@ -146,7 +147,7 @@ namespace FreeSql.Oracle
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }
@ -176,7 +177,7 @@ namespace FreeSql.Oracle
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }

View File

@ -65,8 +65,17 @@ namespace FreeSql.PostgreSQL
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[2].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)";
m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 50; 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) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -82,21 +91,13 @@ namespace FreeSql.PostgreSQL
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
} }
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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -63,8 +63,17 @@ namespace FreeSql.ShenTong
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min(imum)?\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[2].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max(imum)?\s*pool\s*size\s*=\s*(\d+)";
m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success == false || int.TryParse(m.Groups[2].Value, out var poolsize) == false || poolsize <= 0) poolsize = 50; 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) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -80,21 +89,13 @@ namespace FreeSql.ShenTong
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
} }
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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }

View File

@ -68,8 +68,17 @@ namespace FreeSql.SqlServer
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
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[1].Value, out var poolsize) == false || poolsize <= 0) poolsize = 100;
var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1)); var connStrIncr = dicConnStrIncr.AddOrUpdate(_connectionString, 1, (oldkey, oldval) => Math.Min(5, oldval + 1));
PoolSize = poolsize + connStrIncr; PoolSize = poolsize + connStrIncr;
@ -85,21 +94,13 @@ namespace FreeSql.SqlServer
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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);
}
FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize);
} }
} }
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.Open(); if (obj.Value.State == ConnectionState.Closed) obj.Value.Open();
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }
@ -140,7 +141,7 @@ namespace FreeSql.SqlServer
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }
@ -161,7 +162,6 @@ namespace FreeSql.SqlServer
if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false) if (obj.Value.State != ConnectionState.Open || DateTime.Now.Subtract(obj.LastReturnTime).TotalSeconds > 60 && (await obj.Value.PingAsync()) == false)
{ {
try try
{ {
await obj.Value.OpenAsync(); await obj.Value.OpenAsync();
@ -170,7 +170,7 @@ namespace FreeSql.SqlServer
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }

View File

@ -76,8 +76,17 @@ namespace FreeSql.Sqlite
{ {
_connectionString = value ?? ""; _connectionString = value ?? "";
var pattern = @"Max\s*pool\s*size\s*=\s*(\d+)"; var minPoolSize = 0;
Match m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase); var pattern = @"Min\s*pool\s*size\s*=\s*(\d+)";
var m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success)
{
minPoolSize = int.Parse(m.Groups[1].Value);
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase);
}
pattern = @"Max\s*pool\s*size\s*=\s*(\d+)";
m = Regex.Match(_connectionString, pattern, RegexOptions.IgnoreCase);
if (m.Success) if (m.Success)
{ {
PoolSize = int.Parse(m.Groups[1].Value); PoolSize = int.Parse(m.Groups[1].Value);
@ -92,15 +101,6 @@ namespace FreeSql.Sqlite
_connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); _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, @"Pooling\s*=\s*", RegexOptions.IgnoreCase); var att = Regex.Split(_connectionString, @"Pooling\s*=\s*", RegexOptions.IgnoreCase);
if (att.Length == 2) if (att.Length == 2)
{ {
@ -132,6 +132,7 @@ namespace FreeSql.Sqlite
public bool OnCheckAvailable(Object<DbConnection> obj) public bool OnCheckAvailable(Object<DbConnection> obj)
{ {
if (obj.Value == null) return false;
if (obj.Value.State == ConnectionState.Closed) obj.Value.OpenAndAttach(Attaches); if (obj.Value.State == ConnectionState.Closed) obj.Value.OpenAndAttach(Attaches);
return obj.Value.Ping(true); return obj.Value.Ping(true);
} }
@ -174,7 +175,7 @@ namespace FreeSql.Sqlite
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }
@ -204,7 +205,7 @@ namespace FreeSql.Sqlite
{ {
if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true) if (_pool.SetUnavailable(ex, obj.LastGetTimeCopy) == true)
throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}"); throw new Exception($"【{this.Name}】Block access and wait for recovery: {ex.Message}");
throw ex; throw;
} }
} }
} }