Ver código fonte

增加注册Freesql实例空闲回收时间设置

zhontai 3 anos atrás
pai
commit
448b4a565e
1 arquivos alterados com 55 adições e 47 exclusões
  1. 55 47
      Admin.Core.Repository/Base/IdleBusExtesions.cs

+ 55 - 47
Admin.Core.Repository/Base/IdleBusExtesions.cs

@@ -23,9 +23,7 @@ namespace Admin.Core.Repository
 
             if (appConfig.Tenant && user.DataIsolationType == DataIsolationType.OwnDb)
             {
-                var tenantName = "tenant_" + user.TenantId?.ToString();
-                ib.TryRegister(tenantName, () => CreateFreeSql(user, appConfig, serviceProvider));
-                return ib.Get(tenantName);
+                return RegisterAndGetFreeSql(ib, user, appConfig, serviceProvider);
             }
             else
             {
@@ -35,70 +33,80 @@ namespace Admin.Core.Repository
         }
 
         /// <summary>
-        /// 创建FreeSql实例
+        /// 注册并获得FreeSql实例
         /// </summary>
         /// <param name="user"></param>
         /// <param name="appConfig"></param>
         /// <param name="serviceProvider"></param>
         /// <returns></returns>
-        private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, IServiceProvider serviceProvider)
+        private static IFreeSql RegisterAndGetFreeSql(IdleBus<IFreeSql> ib, IUser user, AppConfig appConfig, IServiceProvider serviceProvider)
         {
-            var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
+            var tenantName = "tenant_" + user.TenantId?.ToString();
+            var exists = ib.Exists(tenantName);
+            if (!exists)
+            {
+                var dbConfig = serviceProvider.GetRequiredService<DbConfig>();
+                //查询租户数据库信息
+                var freeSql = serviceProvider.GetRequiredService<IFreeSql>();
+                var tenantRepository = freeSql.GetRepository<TenantEntity>();
+                var tenant = tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOne(a => new { a.DbType, a.ConnectionString, a.IdleTime });
 
-            //查询租户数据库信息
-            var freeSql = serviceProvider.GetRequiredService<IFreeSql>();
-            var tenantRepository = freeSql.GetRepository<TenantEntity>();
-            var tenant = tenantRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(user.TenantId).ToOne(a => new { a.DbType, a.ConnectionString });
+                var timeSpan = tenant.IdleTime.HasValue && tenant.IdleTime.Value > 0 ? TimeSpan.FromMinutes(tenant.IdleTime.Value) : TimeSpan.MaxValue;
+                ib.TryRegister(tenantName, () =>
+                {
+                    var freeSqlBuilder = new FreeSqlBuilder()
+                        .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
+                        .UseAutoSyncStructure(false)
+                        .UseLazyLoading(false)
+                        .UseNoneCommandParameter(true);
 
-            var freeSqlBuilder = new FreeSqlBuilder()
-                    .UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
-                    .UseAutoSyncStructure(false)
-                    .UseLazyLoading(false)
-                    .UseNoneCommandParameter(true);
+                    #region 监听所有命令
 
-            #region 监听所有命令
+                    if (dbConfig.MonitorCommand)
+                    {
+                        freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
+                        {
+                            Console.WriteLine($"{cmd.CommandText}\r\n");
+                        });
+                    }
 
-            if (dbConfig.MonitorCommand)
-            {
-                freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
-                {
-                    Console.WriteLine($"{cmd.CommandText}\r\n");
-                });
-            }
+                    #endregion 监听所有命令
 
-            #endregion 监听所有命令
+                    var fsql = freeSqlBuilder.Build();
+                    fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
 
-            var fsql = freeSqlBuilder.Build();
-            fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
+                    //配置实体
+                    DbHelper.ConfigEntity(fsql, appConfig);
 
-            //配置实体
-            DbHelper.ConfigEntity(fsql, appConfig);
+                    #region 监听Curd操作
 
-            #region 监听Curd操作
+                    if (dbConfig.Curd)
+                    {
+                        fsql.Aop.CurdBefore += (s, e) =>
+                        {
+                            Console.WriteLine($"{e.Sql}\r\n");
+                        };
+                    }
 
-            if (dbConfig.Curd)
-            {
-                fsql.Aop.CurdBefore += (s, e) =>
-                {
-                    Console.WriteLine($"{e.Sql}\r\n");
-                };
-            }
+                    #endregion 监听Curd操作
 
-            #endregion 监听Curd操作
+                    #region 审计数据
 
-            #region 审计数据
+                    //计算服务器时间
+                    var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
+                    var timeOffset = DateTime.UtcNow.Subtract(serverTime);
+                    fsql.Aop.AuditValue += (s, e) =>
+                    {
+                        DbHelper.AuditValue(e, timeOffset, user);
+                    };
 
-            //计算服务器时间
-            var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
-            var timeOffset = DateTime.UtcNow.Subtract(serverTime);
-            fsql.Aop.AuditValue += (s, e) =>
-            {
-                DbHelper.AuditValue(e, timeOffset, user);
-            };
+                    #endregion 审计数据
 
-            #endregion 审计数据
+                    return fsql;
+                }, timeSpan);
+            }
 
-            return fsql;
+            return ib.Get(tenantName);
         }
     }
 }