Explorar o código

优化多数据库使用方式

zhontai %!s(int64=2) %!d(string=hai) anos
pai
achega
4d50db3fb5

+ 10 - 8
src/hosts/ZhonTai.Host/Configs/dbconfig.json

@@ -8,7 +8,7 @@
   "createDb": false,
   //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess
   //建库连接字符串
-  //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;"
+  //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;SslMode=none;Min pool size=1"
   //SqlServer "Data Source=.;User Id=sa;Password=pwd;Initial Catalog=master;TrustServerCertificate=true;Pooling=true;Min Pool Size=1"
   //PostgreSQL "Host=localhost;Port=5432;Username=postgres;Password=; Database=postgres;Pooling=true;Minimum Pool Size=1",
   "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;",
@@ -32,7 +32,7 @@
   //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11, Dameng = 12, OdbcKingbaseES = 13, ShenTong = 14, KingbaseES = 15, Firebird = 16
   "type": "Sqlite",
   //连接字符串
-  //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;"
+  //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;SslMode=none;Min pool size=1"
   //SqlServer "Data Source=.;User Id=sa;Password=pwd;Initial Catalog=admindb;TrustServerCertificate=true;Pooling=true;Min Pool Size=1"
   //PostgreSQL "Host=localhost;Port=5432;Username=postgres;Password=; Database=admindb;Pooling=true;Minimum Pool Size=1"
   //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1"
@@ -45,13 +45,15 @@
   "idleTime": 10,
 
   //多数据库
-  //1、Consts.DbKeys中定义数据库唯一键
+  //使用仓储 public ModuleRepository(UnitOfWorkManagerCloud muowm) : base(DbKeys.MultiDbKey + "admindb", muowm)
+  //使用FreeSqlCloud  freeSqlCloud.Use(DbKeys.MultiDbKey + "admindb");
   "dbs": [
-    //{
-    //  "name": "MySqlDb",
-    //  "type": "MySql",
-    //  "connectionString": "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;"
-    //}
+    {
+      "key": "admindb",
+      "type": "Sqlite",
+      "connectionString": "Data Source=|DataDirectory|\\db\\admindb.db; Pooling=true;Min Pool Size=1",
+      "providerType": ""
+    }
   ],
 
   //分布式事务唯一标识

+ 26 - 21
src/platform/ZhonTai.Admin/Core/Configs/DbConfig.cs

@@ -2,27 +2,6 @@
 
 namespace ZhonTai.Admin.Core.Configs;
 
-/// <summary>
-/// 多数据库
-/// </summary>
-public class MultiDb
-{
-    /// <summary>
-    /// 数据库命名
-    /// </summary>
-    public string Name { get; set; }
-
-    /// <summary>
-    /// 数据库类型
-    /// </summary>
-    public DataType Type { get; set; }
-
-    /// <summary>
-    /// 数据库字符串
-    /// </summary>
-    public string ConnectionString { get; set; }
-}
-
 /// <summary>
 /// 数据库配置
 /// </summary>
@@ -104,6 +83,32 @@ public class DbConfig
     public SlaveDb[] SlaveList { get; set; }
 }
 
+/// <summary>
+/// 多数据库
+/// </summary>
+public class MultiDb
+{
+    /// <summary>
+    /// 数据库键
+    /// </summary>
+    public string Key { get; set; }
+
+    /// <summary>
+    /// 数据库类型
+    /// </summary>
+    public DataType Type { get; set; }
+
+    /// <summary>
+    /// 数据库字符串
+    /// </summary>
+    public string ConnectionString { get; set; }
+
+    /// <summary>
+    /// 指定程序集
+    /// </summary>
+    public string ProviderType { get; set; }
+}
+
 /// <summary>
 /// 读写分离从库
 /// </summary>

+ 70 - 3
src/platform/ZhonTai.Admin/Core/Db/DBServiceCollectionExtensions.cs

@@ -11,6 +11,9 @@ using ZhonTai.Admin.Core.Auth;
 using ZhonTai.Admin.Core.Startup;
 using ZhonTai.Admin.Core.Consts;
 using System.Linq;
+using MySqlX.XDevAPI;
+using static Org.BouncyCastle.Math.EC.ECCurve;
+using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Core.Db;
 
@@ -26,10 +29,11 @@ public static class DBServiceCollectionExtensions
     /// <returns></returns>
     public static void AddAdminDb(this IServiceCollection services, FreeSqlCloud freeSqlCloud, IHostEnvironment env, HostAppOptions hostAppOptions)
     {
+        var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
+        var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
+
         freeSqlCloud.Register(DbKeys.AdminDbKey, () =>
         {
-            var dbConfig = ConfigHelper.Get<DbConfig>("dbconfig", env.EnvironmentName);
-
             //创建数据库
             if (dbConfig.CreateDb)
             {
@@ -70,7 +74,6 @@ public static class DBServiceCollectionExtensions
             fsql.GlobalFilter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false);
 
             //配置实体
-            var appConfig = ConfigHelper.Get<AppConfig>("appconfig", env.EnvironmentName);
             DbHelper.ConfigEntity(fsql, appConfig);
 
             hostAppOptions?.ConfigureFreeSql?.Invoke(fsql);
@@ -144,5 +147,69 @@ public static class DBServiceCollectionExtensions
 
             return fsql;
         });
+
+        //导入多数据库
+        if (dbConfig.Dbs?.Length > 0)
+        {
+            foreach (var db in dbConfig.Dbs)
+            {
+                freeSqlCloud.Register(DbKeys.MultiDbKey + db.Key, () =>
+                {
+                    #region FreeSql
+
+                    var freeSqlBuilder = new FreeSqlBuilder()
+                            .UseConnectionString(db.Type, db.ConnectionString, db.ProviderType.NotNull() ? Type.GetType(db.ProviderType) : null)
+                            .UseAutoSyncStructure(false)
+                            .UseLazyLoading(false)
+                            .UseNoneCommandParameter(true);
+
+                    hostAppOptions?.ConfigureFreeSqlBuilder?.Invoke(freeSqlBuilder);
+
+                    #region 监听所有命令
+
+                    if (dbConfig.MonitorCommand)
+                    {
+                        freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
+                        {
+                            //Console.WriteLine($"{cmd.CommandText}\n{traceLog}\r\n");
+                            Console.WriteLine($"{cmd.CommandText}\r\n");
+                        });
+                    }
+
+                    #endregion 监听所有命令
+
+                    var fsql = freeSqlBuilder.Build();
+                     
+                    #region 监听Curd操作
+
+                    if (dbConfig.Curd)
+                    {
+                        fsql.Aop.CurdBefore += (s, e) =>
+                        {
+                            if (appConfig.MiniProfiler)
+                            {
+                                MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
+                            }
+                            Console.WriteLine($"{e.Sql}\r\n");
+                        };
+                        fsql.Aop.CurdAfter += (s, e) =>
+                        {
+                            if (appConfig.MiniProfiler)
+                            {
+                                MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
+                            }
+                        };
+                    }
+
+                    #endregion 监听Curd操作
+
+                    #endregion FreeSql
+
+                    return fsql;
+                });
+            }
+        }
+
+        var a = freeSqlCloud.Use(DbKeys.MultiDbKey + "admindb").Select<UserEntity>().ToList();
     }
 }

+ 0 - 4
src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs

@@ -114,10 +114,6 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
         TenantEntity tenant = await _tenantRepository.InsertAsync(entity);
         long tenantId = tenant.Id;
 
-        //var freeSqlCloud = LazyGetRequiredService<FreeSqlCloud>();
-        //freeSqlCloud.GetTenantDb(ServiceProvider, tenantId);
-        //freeSqlCloud.Change(DbKeys.TenantDbKey + tenantId);
-
         //添加部门
         var org = new OrgEntity
         {

+ 26 - 21
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -395,26 +395,6 @@
             应用程序类型
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Core.Configs.MultiDb">
-            <summary>
-            多数据库
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.Name">
-            <summary>
-            数据库命名
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.Type">
-            <summary>
-            数据库类型
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.ConnectionString">
-            <summary>
-            数据库字符串
-            </summary>
-        </member>
         <member name="T:ZhonTai.Admin.Core.Configs.DbConfig">
             <summary>
             数据库配置
@@ -432,7 +412,7 @@
         </member>
         <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.ProviderType">
             <summary>
-            指定供应商类型
+            指定程序集
             </summary>
         </member>
         <member name="P:ZhonTai.Admin.Core.Configs.DbConfig.IdleTime">
@@ -495,6 +475,31 @@
             读写分离从库列表
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Core.Configs.MultiDb">
+            <summary>
+            多数据库
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.Key">
+            <summary>
+            数据库键
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.Type">
+            <summary>
+            数据库类型
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.ConnectionString">
+            <summary>
+            数据库字符串
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Core.Configs.MultiDb.ProviderType">
+            <summary>
+            指定程序集
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Core.Configs.SlaveDb">
             <summary>
             读写分离从库