diff --git a/读写分离.md b/读写分离.md index 7ec4088..e38e24d 100644 --- a/读写分离.md +++ b/读写分离.md @@ -28,6 +28,43 @@ fsql.Select().Master().WhereId(a => a.Id == 1).ToOne(); //强制读【主库 fsql.Ado.Query("/*master*/ select * from t where ..."); //强制读【主库】 ``` +## 使用 FreeSqlCloud 另一种读写分离 + +```csharp +public enum DbEnum { db1, db2, db3 } + +var fsql = new FreeSqlCloud(); + +fsql.Register(DbEnum.db3, () => new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, @"Data Source=:memory:;max pool size=1") + .UseAutoSyncStructure(true).Build()); +fsql.Register(DbEnum.db2, () => new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, @"Data Source=:memory:;max pool size=2") + .UseAutoSyncStructure(true).Build()); +fsql.Register(DbEnum.db1, () => new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, @"Data Source=:memory:;max pool size=3") + .UseAutoSyncStructure(true).Build()); + +fsql.EntitySteering = (_, e) => +{ + switch (e.MethodName) + { + case "Select": + if (e.DBKey == DbEnum.db1) //判断主库时 + { + var dbkeyIndex = new Random().Next(0, e.AvailableDBKeys.Length); + e.DBKey = e.AvailableDBKeys[dbkeyIndex]; //重新定向到其他 db + } + break; + case "Insert": + case "Update": + case "Delete": + case "InsertOrUpdate": + break; + } +}; +``` + ## 参考资料 - [《数据库事务》](%e4%ba%8b%e5%8a%a1)